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:// 开头”的主要内容,如果未能解决你的问题,请参考以下文章

用Node创建GraphQL API:代码量少,性能高

带有 graphql cli 的 Azure node.js 相对路径

Node.js - 如何使用 graphql 获取关联的模型数据?

node.js graphql/sequelize 服务器为链接属性返回 null

GraphQL 如何比 REST 更高效?

在 Gatsby-node.js 中检索多种数据类型时,graphql 重复文档错误