Node.js GraphQL API 在我部署后立即停止工作:“验证数据源 `db` 时出错:URL 必须以协议 `mysql:// 开头”
Posted
技术标签:
【中文标题】Node.js GraphQL API 在我部署后立即停止工作:“验证数据源 `db` 时出错:URL 必须以协议 `mysql:// 开头”【英文标题】:Node.js GraphQL API Stops working as soon as I deploy it: "Error validating datasource `db`: the URL must start with the protocol `mysql://" 【发布时间】:2022-01-13 05:44:24 【问题描述】:我使用 Apollo 和 Prisma ORM 构建了一个 GraphQL API,它连接到我托管的 mysql 数据库(数据库中已经有内容)。 当我在本地主机上运行它时,一切正常,我可以使用 GraphQL 语句查询数据库。 一旦我将 node.js 项目部署到 DigitalOcean(使用 GitHub 自动部署),它就会停止工作,并且出现以下错误:
"errors": [
"message": "\nInvalid `prisma.content.findMany()` invocation in\n/workspace/src/schema.js:36:29\n\n 33 const resolvers = \n 34 Query: \n 35 memes: (parent, args) => \n→ 36 return prisma.content.findMany(\n error: Error validating datasource `db`: the URL must start with the protocol `mysql://`.\n --> schema.prisma:7\n | \n 6 | provider = \"mysql\"\n 7 | url = env(\"DATABASE_URL\")\n | \n\nValidation Error Count: 1",
"locations": [
"line": 2,
"column": 3
],
"path": [
"memes"
],
"extensions":
"code": "INTERNAL_SERVER_ERROR",
"exception":
"clientVersion": "3.6.0",
"stacktrace": [
"Error: ",
"Invalid `prisma.content.findMany()` invocation in",
"/workspace/src/schema.js:36:29",
"",
" 33 const resolvers = ",
" 34 Query: ",
" 35 memes: (parent, args) => ",
"→ 36 return prisma.content.findMany(",
" error: Error validating datasource `db`: the URL must start with the protocol `mysql://`.",
" --> schema.prisma:7",
" | ",
" 6 | provider = \"mysql\"",
" 7 | url = env(\"DATABASE_URL\")",
" | ",
"",
"Validation Error Count: 1",
" at cb (/workspace/node_modules/@prisma/client/runtime/index.js:38689:17)",
" at processTicksAndRejections (internal/process/task_queues.js:97:5)"
]
],
"data": null
这是我的 schema.prisma 文件:
generator client
provider = "prisma-client-js"
datasource db
provider = "mysql"
url = env("DATABASE_URL")
...
与本地项目相比,托管项目的唯一不同之处在于我将 .env 文件和 node_modules 放在了 .gitignore 文件中。 所以看起来项目正在访问错误的 DATABASE_URL,但是当 .env 文件位于 .gitignore 上时,托管项目应该如何知道我的 .env 文件中的 DATABASE_URL?
这是我的工作:
-
将 .env 文件中的 DATABASE_URL 更改为托管在 docker 容器上的本地 MySQL 数据库
运行 npx prisma migrate dev --preview-feature 以生成迁移文件
运行 git add .
运行 git commit -m "New Commit"
运行 DATABASE_URL=mysql://censored:censored@censored:3306/censored npx prisma migrate resolve --applied "my_migration_folder_name" --preview-feature 成功并告诉我“迁移 my_migration_folder_name 已标记已应用。”
运行 git push
我可以看到迁移已在我的 MySQL 数据库上成功创建,但是一旦我运行应用程序并尝试查询数据库,它就会给我这个错误。
代码必须正确,因为即使在查询托管的 MySQL 数据库时它也在我的本地主机上运行。 我还仔细检查了 schema.prisma 文件中的模型是否与我托管的 MySQL 数据库架构同步。
我已经没有什么可以尝试的想法了。
编辑
我实际上认为这与我在 DigitalOcean 应用程序设置中设置的环境变量有关。 在设置为之前:
envs:
- key: DATABASE_URL
scope: RUN_AND_BUILD_TIME
value: $db.DATABASE_URL
现在我将其设置为:
envs:
- key: DATABASE_URL
scope: RUN_AND_BUILD_TIME
value: mysql://censored:cesnored@censored:3306/censored
我认为这会解决问题,但现在它告诉我连接失败是因为数据库凭据错误,即使它是具有正确凭据的正确链接。
【问题讨论】:
您是否确保您提供的数据库 URL 可以通过 Internet 访问?您可能不小心使用了本地网络中的连接,或者需要将所有 ip 连接到白名单的连接。 @TasinIshmam 如何检查我的数据库 URL 在 Internet 上是否有效?它不是 http URL。 【参考方案1】:我通过在我的 digitalOcean 应用上单击“强制重建和部署”来修复它。
【讨论】:
以上是关于Node.js GraphQL API 在我部署后立即停止工作:“验证数据源 `db` 时出错:URL 必须以协议 `mysql:// 开头”的主要内容,如果未能解决你的问题,请参考以下文章
带有 graphql cli 的 Azure node.js 相对路径
Node.js - 如何使用 graphql 获取关联的模型数据?