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