Соединение с надбазой возвращает неопределенное значение

У меня есть развернутый проект Vercel Remix с Supabase на бэкэнде, Postgresql и с использованием Prisma в качестве ORM. Я настроил пул соединений, а также прямое соединение с Supabase, но каждый раз, когда я пытаюсь подключиться локально, я получаю эту ошибку:

🔌 setting up prisma client to undefined.db.ubixifkwxkflnueueaku.supabase.co:6543
✅ app ready: http://localhost:3000
✅ metrics ready: http://localhost:3001/metrics

C:\Users\TylerD\Desktop\dev\TheCityGomorrah\node_modules\@prisma\client\runtime\library.js:101
You may have to run ${Gt.default.greenBright("prisma generate")} for your changes to take effect.`,this.config.clientVersion);return r}parseEngineResponse(r){if (!r)throw new W("Response from the Engine was empty",{clientVersion:this.config.clientVersion});try{return JSON.parse(r)}catch{throw new W("Unable to JSON.parse response from engine",{clientVersion:this.config.clientVersion})}}convertDatasources(r){let n=Object.create(null);for(let{name:i,url:o}of r)n[i]=o;return n}async loadEngine(){if (!this.engine){this.QueryEngineConstructor||(this.library=await this.libraryLoader.loadLibrary(),this.QueryEngineConstructor=this.library.QueryEngine);try{let r=new WeakRef(this);this.engine=new this.QueryEngineConstructor({datamodel:this.datamodel,env:process.env,logQueries:this.config.logQueries??!1,ignoreEnvVarErrors:!0,datasourceOverrides:this.datasourceOverrides,logLevel:this.logLevel,configDir:this.config.cwd,engineProtocol:this.engineProtocol},n=>{r.deref()?.logger(n)}),Nl++}catch(r){let n=r,i=this.parseInitError(n.message);throw typeof i= = "string"?n:new G(i.message,this.config.clientVersion,i.error_code)}}}logger(r){let n=this.parseEngineResponse(r);if (!!n){if ("span"in n){this.config.tracingConfig.enabled===!0&&co(n);return}n.level=n?.level.toLowerCase()??"unknown",Vd(n)?this.logEmitter.emit("query",{timestamp:new Date,query:n.query,params:n.params,duration:Number(n.duration_ms),target:n.module_path}):Qd(n)?this.loggerRustPanic=new ce(this.getErrorMessageWithLink(`${n.message}: ${n.reason} in ${n.file}:${n.line}:${n.column}`),this.config.clientVersion):this.logEmitter.emit(n.level,{timestamp:new Date,message:n.message,target:n.module_path})}}getErrorMessageWithLink(r){return Ya({platform:this.platform,title:r,version:this.config.clientVersion,engineVersion:this.versionInfo?.commit,database:this.config.activeProvider,query:this.lastQuery})}parseInitError(r){try{return JSON.parse(r)}catch{}return r}parseRequestError(r){try{return JSON.parse(r)}catch{}return r}on(r,n){r== = "beforeExit"?this.beforeExitListener=n:this.logEmitter.on(r,n)}async start(){if (await this.libraryInstantiationPromise,await this.libraryStoppingPromise,this.libraryStartingPromise)return je(`library already starting, this.libraryStarted: ${this.libraryStarted}`),this.libraryStartingPromise;if (this.libraryStarted)return;let r=l(async()=>{je("library starting");try{let i = {traceparent:Ne({tracingConfig:this.config.tracingConfig})};await this.engine?.connect(JSON.stringify(i)),this.libraryStarted=!0,je("library started")}catch(i){let o=this.parseInitError(i.message);throw typeof o= = "string"?i:new G(o.message,this.config.clientVersion,o.error_code)}finally{this.libraryStartingPromise=void 0}},"startFn"),n = {name:"connect",enabled:this.config.tracingConfig.enabled};return this.libraryStartingPromise=fe(n,r),this.libraryStartingPromise}async stop(){if (await this.libraryStartingPromise,await this.executingQueryPromise,this.libraryStoppingPromise)return je("library is already stopping"),this.libraryStoppingPromise;if (!this.libraryStarted)return;let r=l(async()=>{await new Promise(o=>setTimeout(o,5)),je("library stopping");let i = {traceparent:Ne({tracingConfig:this.config.tracingConfig})};await this.engine?.disconnect(JSON.stringify(i)),this.libraryStarted=!1,this.libraryStoppingPromise=void 0,je("library stopped")},"stopFn"),n = {name:"disconnect",enabled:this.config.tracingConfig.enabled};return this.libraryStoppingPromise=fe(n,r),this.libraryStoppingPromise}async getDmmf(){await this.start();let r=Ne({tracingConfig:this.config.tracingConfig}),n=await this.engine.dmmf(JSON.stringify({traceparent:r}));return fe({name:"parseDmmf",enabled:this.config.tracingConfig.enabled,internal:!0},()=>JSON.parse(n))}version(){return this.versionInfo=this.library?.version(),this.versionInfo?.version??"unknown"}debugPanic(r){return this.library?.debugPanic(r)}async request(r,{traceparent:n,interactiveTransaction:i}){je(`sending request, this.libraryStarted: ${this.libraryStarted}`);let o=JSON.stringify({traceparent:n}),s=JSON.stringify(r);try{await this.start(),this.executingQueryPromise=this.engine?.query(s,o,i?.id),this.lastQuery=s;let a=this.parseEngineResponse(await this.executingQueryPromise);if (a.errors)throw a.errors.length===1?this.buildQueryError(a.errors[0]):new W(JSON.stringify(a.errors),{clientVersion:this.config.clientVersion});if (this.loggerRustPanic)throw this.loggerRustPanic;return{data:a,elapsed:0}}catch(a){if (a instanceof G)throw a;if (a.code== = "GenericFailure"&&a.message?.startsWith("PANIC:"))throw new ce(this.getErrorMessageWithLink(a.message),this.config.clientVersion);let u=this.parseRequestError(a.message);throw typeof u= = "string"?a:new W(`${u.message}
                                                                                                                                          
     ^
Error: Can't reach database server at `undefined.db.ubixifkwxkflnueueaku.supabase.co`:`6543`

Please make sure your database server is running at `undefined.db.ubixifkwxkflnueueaku.supabase.co`:`6543`.
    at startFn (C:\Users\TylerD\Desktop\dev\TheCityGomorrah\node_modules\@prisma\client\runtime\library.js:101:2598)

Точно так же, если я попытаюсь зарегистрировать пользователя в развертывании Vercel, он сработает, но ничего не сохранит в базе данных. Но при попытке входа в журналы Vercel выдает аналогичную ошибку:

Unhandled Promise Rejection     {"errorType":"Runtime.UnhandledPromiseRejection","errorMessage":"Error: Can't reach database server at `undefined.db.ijpeuroobfrvafcvrtfa.supabase.co`:`5432`\n\nPlease make sure your database server is running at `undefined.db.ijpeuroobfrvafcvrtfa.supabase.co`:`5432`.","reason":{"errorType":"Error","errorMessage":"Can't reach database server at `undefined.db.ijpeuroobfrvafcvrtfa.supabase.co`:`5432`\n\nPlease make sure your database server is running at `undefined.db.ijpeuroobfrvafcvrtfa.supabase.co`:`5432`.","clientVersion":"4.11.0","errorCode":"P1001","stack":["Error: Can't reach database server at `undefined.db.ijpeuroobfrvafcvrtfa.supabase.co`:`5432`","","Please make sure your database server is running at `undefined.db.ijpeuroobfrvafcvrtfa.supabase.co`:`5432`.","    at startFn (/var/task/node_modules/@prisma/client/runtime/library.js:101:2598)"]},"promise":{},"stack":["Runtime.UnhandledPromiseRejection: Error: Can't reach database server at `undefined.db.ijpeuroobfrvafcvrtfa.supabase.co`:`5432`","","Please make sure your database server is running at `undefined.db.ijpeuroobfrvafcvrtfa.supabase.co`:`5432`.","    at process.<anonymous> (file:///var/runtime/index.mjs:1188:17)","    at process.emit (node:events:525:35)","    at process.emit (/var/task/node_modules/source-map-support/source-map-support.js:516:21)","    at emit (node:internal/process/promises:149:20)","    at processPromiseRejections (node:internal/process/promises:283:27)","    at processTicksAndRejections (node:internal/process/task_queues:96:32)"]}
Unknown application error occurred
Runtime.Unknown

Теперь, очевидно, что в БД ничего не хранится, я тоже не могу его получить. Но для ясности, это журналы.

У моего .env есть DATABASE_URL, который предназначен для пула соединений, и DIRECT_URL для обновлений миграции и т. д. Я дважды проверил учетные данные и просмотрел документы Prisma и Supabase, и я просмотрел страницы проблем GH и не смог найти ничего относительно этот.

Журналы Supabase возвращают это:

Log ID
bba2af3c-2839-40ca-be4a-44a7c54dcb2c

Log Timestamp (UTC)
2023-04-02T21:44:16.257Z

Log Event Message
C-0xaaaadd3c6810: pgbouncer/[email protected]:56654 closing because: SASL authentication failed (age=0s)

Log Metadata
[
  {
    "PRIORITY": null,
    "SYSLOG_FACILITY": null,
    "SYSLOG_IDENTIFIER": null,
    "_BOOT_ID": null,
    "_CAP_EFFECTIVE": null,
    "_CMDLINE": null,
    "_COMM": null,
    "_EXE": null,
    "_GID": null,
    "_MACHINE_ID": null,
    "_PID": null,
    "_SELINUX_CONTEXT": null,
    "_SOURCE_REALTIME_TIMESTAMP": null,
    "_STREAM_ID": null,
    "_SYSTEMD_CGROUP": null,
    "_SYSTEMD_INVOCATION_ID": null,
    "_SYSTEMD_SLICE": null,
    "_SYSTEMD_UNIT": null,
    "_TRANSPORT": null,
    "_UID": null,
    "__MONOTONIC_TIMESTAMP": null,
    "__REALTIME_TIMESTAMP": null,
    "file": null,
    "host": "db-ubixifkwxkflnueueaku",
    "metadata": [],
    "project": null,
    "source_type": null
  }
]
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
201
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У меня сегодня точно такая же история случилась. Проблема в том, что когда вы настраиваете его для развертывания на лету. Он автоматически добавит кучу дополнительных настроек в файл app/db.server.ts. В частности, манипулирование клиентом prisma в функции getClient().

Мое предложение (чтобы быстро приступить к работе, просто замените это):

function getClient() {
  const { DATABASE_URL } = process.env;
  invariant(typeof DATABASE_URL === "string", "DATABASE_URL env var not set");
  console.info(`🔌 setting up prisma client to DATABASE_URL`);

  const client = new PrismaClient()

  // connect eagerly
  client.$connect();

  return client;
}
Ответ принят как подходящий

Похоже, вы развертываете приложение из одного из стеков шаблонов Remix — имейте в виду, что app/db.server.ts по умолчанию включает в себя набор конкретных конфигураций FLY.io. (подсказка: вы можете найти сообщение об ошибке 🔌 setting up prisma client to, чтобы найти файл)

В частности, эта часть:

    if (!isLocalHost) {
      databaseUrl.host = `${FLY_REGION}.${databaseUrl.host}`

считывает переменную среды FLY_REGION, и если эта переменная env отсутствует, она будет оцениваться как «undefined.{database_url}», что вы и видите здесь.

Другие вопросы по теме

Почему ESLint сообщает об ошибке @typescript/no-redeclare для объединенного интерфейса и переменной?
Как выполнить горячую перезагрузку Typescript Lambda с помощью локального стека
Jest-тестирование службы, использующей Neo4J и MongoDb, возвращает ошибку: «TypeError: невозможно прочитать свойства неопределенного (чтение« inspectModules »)»
Infer не удовлетворяет ограничениям типа?
React — динамически импортировать компонент или функцию не по умолчанию
Разбивка таблицы MUI DataGrid не работает
Сфокусируйте родителя на дочернем элементе с помощью React Hooks
Ошибка: объекты недействительны в качестве дочернего элемента React — при попытке асинхронного выполнения на page.tsx в nextjs
Ошибка NextJS: гидратация не удалась, поскольку исходный пользовательский интерфейс не соответствует тому, что было отображено на сервере. в папке экспериментального каталога приложения
После деструктурирования присваивания с помощью «let» я не могу отказаться от их переменной?