Node.js API GraphQL перестает работать, как только я его развертываю: «Ошибка проверки источника данных «бд»: URL-адрес должен начинаться с протокола » mysql://»

#mysql #node.js #api #graphql #prisma

#mysql #node.js #API #graphql #призма

Вопрос:

Я создаю API GraphQL с Apollo и Prisma ORM, который подключен к моей размещенной базе данных MySQL (в базе данных уже есть содержимое). Когда я запускаю его на своем локальном хосте, все работает нормально, и я могу запрашивать базу данных с помощью инструкций GraphQL. Как только я разверну свой node.js проект в DigitalOcean (автоматическое развертывание с помощью GitHub) перестает работать, и я получаю следующую ошибку:

 {  "errors": [  {  "message": "nInvalid `prisma.content.findMany()` invocation inn/workspace/src/schema.js:36:29nn 33 const resolvers = {n 34 Query: {n 35 memes: (parent, args) =gt; {n→ 36 return prisma.content.findMany(n error: Error validating datasource `db`: the URL must start with the protocol `mysql://`.n --gt; schema.prisma:7n | n 6 | provider = "mysql"n 7 | url = env("DATABASE_URL")n | nnValidation 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) =gt; {",  "→ 36 return prisma.content.findMany(",  " error: Error validating datasource `db`: the URL must start with the protocol `mysql://`.",  " --gt; 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, но как размещенный проект должен знать DATABASE_URL в моем файле .env, когда файл .env находится на .gitignore?

Вот что я делаю:

  1. Измените DATABASE_URL в моем файле .env на мою локальную базу данных MySQL, размещенную в контейнере docker
  2. Запустите npx prisma migrate dev —предварительный просмотр-функция для создания файлов миграции
  3. Запустите git add .
  4. Запустите git commit -m «Новая фиксация»
  5. Беги DATABASE_URL=mysql://censored:censored@censored:3306/censored решение для миграции npx prisma-применено «имя папки my_migration» — функция предварительного просмотра, которая завершается успешно и сообщает мне «Имя папки my_migration отмечено как примененное».
  6. Запустите 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  

Я думал, что это устранит проблему, но теперь он говорит мне, что соединение не работает из-за неправильных учетных данных базы данных, хотя это правильная связь с правильными учетными данными.

Комментарии:

1. Вы убедились, что URL-адрес базы данных, который вы предоставляете, доступен через Интернет? Возможно, вы случайно используете соединение в своей локальной сети или соединение, для которого требуется, чтобы все ip-адреса, подключенные к нему, были занесены в белый список.

2. @TasinIshmam как мне проверить, действителен ли URL-адрес моей базы данных через Интернет? Это не URL-адрес http.

Ответ №1:

Я исправил это, нажав «Принудительно перестроить и развернуть» в своем приложении DigitalOcean. введите описание изображения здесь