我花了几天时间试图找出为什么我的后端无法在我的应用程序的在线版本上运行。我创建了一个 Nuxt 项目,它使用 Prisma 作为一个非常小且简单的数据库。
在积极使用 prisma 之前,我已经构建了应用程序的“Nuxt 部分”(尽管它已经实现到项目中)。
过了一段时间,我为 prisma 创建了一个非常基本的 API 来使用,并且一切都可以在本地工作,然后我尝试通过添加以下行在 Heroku 上构建它:
release: npx prisma migrate deploy
到我的 Procfile。
我以为这将使用最新的迁移来重新创建我的本地数据库,但是当导航在线版本时,我注意到依赖于数据库的所有内容都不起作用,因为它可能不在数据库中。
我尝试手动进行迁移并推送分支以查看 Heroku 会记录什么,这就是结果:
2021-12-30T13:46:41.573842+00:00 heroku[release.1710]: State changed from starting to up
2021-12-30T13:46:43.062707+00:00 app[release.1710]: Prisma schema loaded from prisma/schema.prisma
2021-12-30T13:46:43.083393+00:00 app[release.1710]: Datasource "db": SQLite database "dev.db" at "file:./dev.db"
2021-12-30T13:46:43.118865+00:00 app[release.1710]:
2021-12-30T13:46:43.118897+00:00 app[release.1710]: 12 migrations found in prisma/migrations
2021-12-30T13:46:43.118939+00:00 app[release.1710]: WARNING The following migrations have been modified since they were applied:
2021-12-30T13:46:43.118940+00:00 app[release.1710]: 20211216111431_init
2021-12-30T13:46:43.118941+00:00 app[release.1710]:
2021-12-30T13:46:43.120322+00:00 app[release.1710]:
2021-12-30T13:46:43.120440+00:00 app[release.1710]: No pending migrations to apply.
2021-12-30T13:46:43.348438+00:00 heroku[release.1710]: Process exited with status 0
2021-12-30T13:46:43.426838+00:00 heroku[release.1710]: State changed from up to complete
2021-12-30T13:46:45.281380+00:00 app[api]: Release v32 created by user [email protected]
2021-12-30T13:46:46.373458+00:00 heroku[web.1]: Restarting
2021-12-30T13:46:46.454020+00:00 heroku[web.1]: State changed from up to starting
2021-12-30T13:46:47.466600+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2021-12-30T13:46:47.671788+00:00 heroku[web.1]: Process exited with status 143
2021-12-30T13:46:57.249166+00:00 heroku[web.1]: Starting process with command `npm start`
2021-12-30T13:46:58.317560+00:00 app[web.1]:
2021-12-30T13:46:58.317577+00:00 app[web.1]: > [email protected] start /app
2021-12-30T13:46:58.317577+00:00 app[web.1]: > nuxt start
2021-12-30T13:46:58.317577+00:00 app[web.1]:
2021-12-30T13:46:59.566391+00:00 app[web.1]: ℹ Listening on: http://172.17.136.142:51422/
2021-12-30T13:46:59.601868+00:00 heroku[web.1]: State changed from starting to up
我相信这是因为您尝试在 Heroku 上部署 sqlite,但不建议这样做,因为 Heroku 会定期清理磁盘并擦除您的 sqlite 数据库(请参阅Heroku 上的 SQLite)。请使用他们的数据库即服务,他们有一个免费的 postgresql 套餐。这将要求您在本地使用 postgresql,因为 Prisma 删除了拥有多个提供程序的能力(本地的 sqlite 和生产中的 postgresql)。无论如何,最佳实践是在开发和生产中使用相同的数据库。
以下是在 Nuxt 3 中本地运行 postgresql 并将其部署到 Heroku 的一些步骤。
使用 docker 在项目根目录下的
docker-compose.yml
文件中创建 postgres 数据库。
version: "3.1"
services:
db:
image: postgres
restart: always
ports:
- "5432:5432"
env_file:
- .env
在项目根目录中创建一个环境变量文件,
.env
POSTGRES_HOST=0.0.0.0
POSTGRES_PORT=5432
POSTGRES_DB=db
POSTGRES_USER=localadmin
POSTGRES_PASSWORD=
DATABASE_URL=postgres://localadmin:[email protected]:5432/db
为了方便起见,请将一些 npm 脚本添加到您的
package.json
{
"scripts": {
...
"dev": "npm run dev:db && nuxt dev",
"dev:db": "docker-compose up -d db",
"stop": "docker-compose down"
}
}
更新您的 prisma
schema.prisma
并将提供商更改为 postgres
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
现在您应该能够使用
npm run dev
开始本地开发并使用 npm run stop
关闭数据库容器。
创建 Heroku postgres 数据库:
Resources
单击 Find more add-ons
。Heroku Postgres
免费套餐。
(3. ?) 我相信 Heroku 会自动添加配置变量。转到设置和 Show Config Vars
,应该有一个 DATABASE_URL
,其中包含来自新 Heroku Postgres 数据库的凭据。Procfile
的新文件,这会告诉 Heroku 在部署时运行哪些脚本。它应该有 web
和 release
的指令来告诉 Heroku 如何启动服务器以及如何进行迁移。web: npm start
release: npx prisma migrate deploy
希望有帮助!