Skip to content
This page has been auto-translated and may contain errors.View in English

在本地运行 Deployment 课程项目

使用本页在你的计算机上运行提取的 Dream Catcher 项目。你拥有的版本使用的是包含的 SQLite 数据库或单独的 PostgreSQL 数据库。先确认是哪个版本,然后按照对应的本地设置说明进行操作。

开始前需要准备什么

安装受支持的 Node.js LTS 版本。推荐使用 Node 24,它已包含 npm。为项目导入的提供商准备一个密钥和模型名称。

PostgreSQL 版本还需要一个可访问的 PostgreSQL 数据库及其连接字符串,即 postgresql:// URL,其中包含用户名、密码、主机和数据库。如果你不在本地运行 PostgreSQL,托管服务的免费层也能用。SQLite 版本已包含数据库文件,不需要单独的数据库服务。

Juno开始前需要准备什么 安装 Node.js LTS 并准备好 AI 提供商密钥,其他事情都可以稍后再做。如果你的版本使用 PostgreSQL,先创建数据库;我曾经在数据库不存在的情况下启动应用,结果启动时每次都失败!
Juno开始前需要准备什么 Node 已包含 npm,所以一次安装就能覆盖所有工具。只有后期版本需要单独的数据库:一个形如 postgresql://user:password@host:5432/database 的连接字符串,可以来自本地安装或托管服务的免费层。
Juno开始前需要准备什么 SQLite 版本从其捆绑的数据库文件启动;PostgreSQL 版本直到数据库可访问时才会开始监听。在 npm start 之前搞定网络访问、凭证和 TLS,不要等到看到第一个堆栈跟踪后再处理。

确认你提取的版本

如果提取的项目包含 dreams.db,使用 SQLite 说明。它不需要单独的数据库服务。如果其服务器期望 DATABASE_URL,使用 PostgreSQL 说明并准备一个可访问的 PostgreSQL 数据库。

在包含 package.json 的文件夹中打开终端:

bash
$ cd path-to-your-downloaded-project

捆绑的 README 已过时

下载中的 README 描述的是 Claude 和 SQLite 应用,即使代码已迁移到 OpenAI 或 Gemini 和 PostgreSQL。以下载的 package.json、导入和服务器文件为准。

package.json 中的依赖可以确认版本:PostgreSQL 版本包含 pg,较早版本包含原生 SQLite 驱动,服务器文件的导入显示哪个数据库模块是活跃的。

Juno确认你提取的版本 查找 dreams.db 或查看服务器是否需要 DATABASE_URL;这会告诉你是按 SQLite 还是 PostgreSQL 说明操作。现在花十秒钟检查可以省去后面按错误说明操作的时间。
Juno确认你提取的版本 迁移同时改变了数据库和所需的环境变量,所以要先确认再配置。相信提取的代码和 package.json 而不是 README,后者描述的是较早的快照。
Juno确认你提取的版本 阅读 package.json 中的依赖:pg 表示 PostgreSQL 版本,原生 SQLite 驱动表示较早版本。服务器文件的导入显示哪个实际上是活跃的,无论文件夹中还有什么其他东西。我信任导入而不是 README,这个下载就是一个很好的例子说明为什么要这样做。

加载本地 .env 文件

下载的服务器读取 process.env,但其启动命令不会加载本地 .env 文件。打开 package.json 并修改:

json
"start": "node server.js"

改为:

json
"start": "node --env-file=.env server.js"

这使用了 Node 的内置环境文件支持,不需要添加额外的依赖。如果 --env-file 指定的文件缺失,Node 会出错停止,而且 shell 中已设置的变量优先于文件中的值。Intro to AI Engineering 项目的后端需要相同的 --env-file 修改。

确保 .gitignore 包含这两行:

txt
.env
node_modules/

某个课程快照包含拼写错误 mode_modules;在提交项目前改正为 node_modules/。Git 手册在忽略文件和良好习惯中说明了为什么这些条目很重要。

Juno加载本地 .env 文件 给启动脚本添加 --env-file=.env 使 Node 读取你的设置文件,并将 .envnode_modules/ 保持在 Git 之外。我第一次泄露密钥的教训比任何课程都来得快。
Juno加载本地 .env 文件 服务器读取 process.env,但没有什么会将你的本地文件加载到其中。Node 的内置 --env-file 标志可以做到这一点而不增加依赖,所以只需修改一行脚本然后继续。
Juno加载本地 .env 文件 dotenv 包在文件缺失时无声继续,而 --env-file 会让 Node 出错停止,这将一个隐隐约约的配置错误变成启动时的立即故障。shell 中已设置的变量总是优先于文件中的同名变量,所以早期会话中的旧导出会一直保持优先,直到你清除它。我曾为这样一个旧导出浪费过不少时间。

运行 SQLite 版本

Push to GitHub 快照默认导入 OpenAI 实现。在 package.json 旁创建 .env

dotenv
OPENAI_API_KEY=your-api-key-here
OPENAI_MODEL=your-model-id
PORT=3001

DATABASE_PATH 是可选的。不设置它时,服务器使用项目文件夹中的 dreams.db。如果你设置自定义路径,确保其目录存在且可写。

安装锁定的依赖并启动服务器。npm ci 安装的是 lockfile 中的确切版本,原生 SQLite 包需要这样做,因为它是针对你的操作系统和 Node 版本编译的:

bash
$ npm ci
$ npm start

打开 http://localhost:3001/,或者你在 .env 中设置的端口。用 Ctrl+C 停止服务器。

项目还包含 Gemini 实现,但路由默认导入 OpenAI 文件。如果你跟随课程的提供商切换代码,改用 GEMINI_API_KEY 和可选的 GEMINI_MODEL

Juno运行 SQLite 版本 创建 .env,运行 npm cinpm start,然后在浏览器中打开 3001 端口。数据库文件已随项目提供,你无需在这里额外设置任何东西。
Juno运行 SQLite 版本 导入的提供商文件决定了你需要哪些 AI 变量,所以将名称与导入匹配。一个运行的页面和梦列表证明数据库工作正常。它们对 AI 请求证明不了什么,所以创建一个新梦来确认提供商也正常。
Juno运行 SQLite 版本 SQLite 驱动是原生模块,针对你的确切操作系统和 Node 主版本编译,所以从另一台机器上复制过来的安装无法加载。在推荐的 LTS 上从干净提取中运行 npm ci 能正确重建它。安装失败时,在修改数据库路径或提供商设置之前先解决这个问题。

运行 PostgreSQL 版本

后期项目将 SQLite 替换为 PostgreSQL。先创建一个数据库,然后将其连接字符串连同 AI 配置一起添加到 .env

dotenv
DATABASE_URL=postgresql://user:password@host:5432/database
OPENAI_API_KEY=your-api-key-here
OPENAI_MODEL=your-model-id
PORT=3001

然后运行:

bash
$ npm ci
$ npm start

最终项目在监听前初始化其表。如果数据库无法访问或拒绝其 TLS 设置,启动会停止并报告数据库错误。错误文本指向原因:ENOTFOUND 表示主机名未解析,password authentication failed 表示凭证问题,SSL 或 TLS 消息表示加密设置问题。课程代码要求 SSL 连接,所以不使用 TLS 的本地 PostgreSQL 需要在连接字符串中调整该要求。/health 端点在启动后检查连接:

text
http://localhost:3001/health

删除临时关闭路由

Terminating Processes & Signals 课程包含的 /shutdown 端点仅用于测试优雅终止。按照课程说明删除该路由,然后再分享或部署应用。留下一个会终止服务器的公开 URL 是不安全的。

Juno运行 PostgreSQL 版本 先创建数据库,将其连接字符串放在 .env 中,启动应用,然后访问 /health 来确认连接。在与任何人分享应用前删除临时关闭路由;我自己也忘过这一步,这不是一个你想在共享应用中留下的东西。
Juno运行 PostgreSQL 版本 数据库连接和表初始化在 Express 监听前进行,所以网络、凭证或 TLS 问题会让启动完全停止。当服务器从不打印其监听行时,先查看数据库,不要查看应用代码。
Juno运行 PostgreSQL 版本 在改变任何东西前先读启动错误:ENOTFOUND 是 DNS,password authentication failed 是凭证,SSL 投诉是 TLS。课程代码要求 SSL,所以不使用 TLS 的本地 PostgreSQL 需要调整连接字符串以匹配。我不止一次搞错过这三个原因中的哪个。

故障排除

OPENAI_API_KEY environment variable is missing or empty 确认启动脚本包含 --env-file=.env.envpackage.json 旁,且变量名与导入的提供商文件匹配。

页面打开但创建梦返回 AI 错误: 检查提供商密钥和模型。无需实时 AI 请求即可验证页面和现有梦 API 是否工作。

SQLite 报告原生模块错误: 使用推荐的 Node LTS 从干净提取重新安装,使用 npm ci。不要从另一个操作系统复制 node_modules

PostgreSQL 启动失败: 检查完整的 DATABASE_URL、数据库网络访问、凭证和 TLS 要求。最终课程代码要求 SSL 连接。

切换版本后数据库为空: SQLite 中的 dreams.db 数据不会自动出现在 PostgreSQL 中。运行课程的迁移步骤或单独为新数据库填充数据。

Juno故障排除 按这个顺序检查:环境加载、提供商、数据库。记住 SQLite 数据不会自动进入 PostgreSQL;我曾经在理解这一点前盯着一个空的梦列表看了很久。
Juno故障排除 在修改项目前分别处理依赖问题、提供商请求、SQLite 路径和 PostgreSQL 连接。数据不会自己在 SQLite 和 PostgreSQL 版本间转移;有意地迁移或为新数据库填充数据。
Juno故障排除 按启动顺序调试:.env 加载、SQLite 安装或 PostgreSQL 连接和 TLS、表设置、提供商请求。终端中的第一个错误是真正的问题;之后打印的所有内容通常都是该第一个故障的后果。