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

本地运行部署课程项目

用这个页面在你的电脑上运行提取的 Dream Catcher 项目。你拥有的版本使用内置的 SQLite 数据库或单独的 PostgreSQL 数据库。先识别你的版本,然后按照对应的本地设置说明进行。

你需要先准备什么

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

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

Juno你需要先准备什么 在做任何事情之前,先安装 Node.js LTS 并准备好你的 AI 提供商密钥。

如果你的版本使用 PostgreSQL,要先创建那个数据库,并保存好它的连接字符串。应用启动时必须要用到它。

Juno你需要先准备什么 Node 包含 npm,一次安装就搞定工具链了。只有后面的版本需要单独的数据库,通过形如 postgresql://user:password@host:5432/database 的连接字符串连接,可以是本地安装的,也可以是托管服务。
Juno你需要先准备什么 SQLite 版本从打包的数据库文件启动。PostgreSQL 版本在 Express 开始监听之前连接并创建表,所以网络访问、凭证和 TLS 都必须在 npm start 成功前正常工作。

识别你提取的版本

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

package.json 中的依赖可以确认这一点:PostgreSQL 版本中出现 pg,早期版本中出现原生 SQLite 驱动 sqlite3config/database.js 中的导入显示服务器实际使用的是哪个数据库模块。

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

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

打包的 README 已过时

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

Juno识别你提取的版本 查看是否有 dreams.db,或者服务器是否需要 DATABASE_URL。这会告诉你是应该按照 SQLite 还是 PostgreSQL 的说明来做,所以在配置任何东西之前先检查这个。
Juno识别你提取的版本 迁移会同时改变数据库和应用需要的环境值,所以要在配置前识别版本。相信提取的代码和 package.json,而不是 README,因为 README 描述的是旧的快照。
Juno识别你提取的版本 查看依赖:pg 表示 PostgreSQL,sqlite3 表示早期的 SQLite 版本。数据库配置中的导入显示哪个是活跃的,不管文件夹中还有什么其他东西。

加载本地 .env 文件

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

json
"start": "node server.js"

为:

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

这使用 Node 的内置环境文件支持,不需要添加另一个依赖。如果 --env-file 指定的文件缺失,Node 会报错停止,而且你的 shell 中已设置的变量优先于文件中的值。AI 工程入门项目的后端也需要相同的 --env-file 改动。

确保 .gitignore 包含这两行:

txt
.env
node_modules/

提交前检查下载文件中这两行的拼写。Git 手册在忽略文件和良好习惯中介绍了为什么这些条目很重要。

Juno加载本地 .env 文件 在启动脚本中添加 --env-file=.env,这样 Node 就会读取你的设置文件。

然后检查 .gitignore 是否列出了 .envnode_modules/,这样你的密钥和已安装的包就不会进入 Git。

Juno加载本地 .env 文件 服务器读取 process.env,但没有东西会把你的本地文件加载到它里面。Node 的内置 --env-file 标志可以做到这个加载,不需要新依赖,所以修改启动脚本这一行就是全部解决方案。
Juno加载本地 .env 文件 不像加载器会默默跳过缺失的文件,--env-file 会在启动时停止 Node,所以路径错误会发出清晰的错误。你的 shell 中已设置的变量会覆盖文件中的同名变量,所以来自上一个会话的旧 export 会保持其值,直到你取消设置。

运行 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

> [email protected] start
> node --env-file=.env server.js

Server running on http://localhost:3001

打开 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 版本sqlite3 是为你的操作系统和 Node 版本编译的原生模块,所以从另一台机器复制的安装会无法加载。在推荐的 LTS 上从干净的提取中用 npm ci 会正确安装它;在改变数据库路径或提供商设置之前,先修复失败的安装。

运行 PostgreSQL 版本

后期项目用 PostgreSQL 替换了 SQLite。先创建一个数据库,然后把它的连接字符串加到 .env 中,还有 AI 配置:

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

最终项目在监听前初始化表,所以 Server running on http://localhost:3001 只在数据库应答时出现。如果数据库无法到达或拒绝其 TLS 设置,启动会停止并显示 Failed to initialize database: 后跟错误。错误文本指向原因:ENOTFOUND 表示主机名未解析,password authentication failed 表示凭证,SSL 或 TLS 消息表示加密设置。课程代码请求 SSL 连接,适合托管数据库;如果你的本地 PostgreSQL 没有 TLS,连接设置需要与之匹配。

/health 端点在启动后检查连接:

text
http://localhost:3001/health

一个健康的服务器用包含 "status": "ok""db": "connected" 的 JSON 应答。如果数据库后来掉线,同一个 URL 返回 "db": "disconnected" 和数据库错误消息。

移除临时关闭路由

终止进程和信号课程中的 /shutdown 端点仅用于测试优雅终止。按照课程说明删除该路由,然后再共享或部署应用。留下一个终止服务器的公开 URL 是不安全的。

Juno运行 PostgreSQL 版本 先创建你的数据库,把它的连接字符串放在 .env 中,启动应用,然后访问 /health 并查看 "db": "connected"

在和任何人共享应用之前移除临时关闭路由。

Juno运行 PostgreSQL 版本 连接和创建表发生在 Express 监听前,所以网络、凭证或 TLS 问题会完全停止启动。当服务器从不打印它的 Server running 行时,先看数据库,不是应用代码。
Juno运行 PostgreSQL 版本 在改变任何东西之前读启动错误:ENOTFOUND 是 DNS,password authentication failed 是凭证,SSL 错误是 TLS。连接池请求 SSL,所以没有 TLS 的本地服务器需要让其连接设置与之一致。

故障排除

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 启动失败:Failed to initialize database: 后的错误,然后检查完整的 DATABASE_URL、数据库网络访问、凭证和 TLS 要求。最终课程代码请求 SSL 连接。

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

Juno故障排除 按这个顺序先检查环境加载,然后是提供商,然后是数据库。

SQLite 数据不会自动进入 PostgreSQL,所以切换后的空梦想列表是预期的,直到你迁移或填充它。

Juno故障排除 在改变项目之前分离依赖问题、提供商请求、SQLite 路径和 PostgreSQL 连接。数据不会自己在两个版本间转移;故意迁移或填充新数据库。
Juno故障排除 按启动顺序调试:.env 加载,然后是 SQLite 安装或 PostgreSQL 连接和 TLS,然后是表设置,然后是提供商请求。终端中的第一个错误通常是原因;它之后的东西往往是结果。