如何将带数据库的Node.js后端部署到DreamHost主机?
服务端部署相关问题解答
- 不存在和前端文件冲突的可能,两者部署逻辑完全独立:你之前上传的React构建产物是纯静态文件,交给主机自带的Apache/Nginx服务直接对外返回,存放在站点静态根目录(DreamHost默认一般是
public_html文件夹);Node.js服务是独立运行的后端进程,需要单独存放在静态根目录之外的专属文件夹(比如和public_html平级建个node_server文件夹),不要把服务端代码丢到静态资源目录里,避免源码被公网直接下载。 - 要不要执行
npm run build取决于你服务端的代码配置:- 如果你写服务端的时候没有配置TypeScript编译、打包工具(webpack/rollup/esbuild这类),完全不需要执行build命令,直接把本地
Server文件夹里除了node_modules之外的所有文件通过FTP上传到你建好的node_server目录就行,上传完成后在服务器对应目录执行npm install --production安装生产依赖即可,不要直接上传本地的node_modules文件夹,不同环境的依赖兼容性有差异,很容易跑不起来。 - 如果你服务端用了TS或者其他需要编译打包的工具,才需要在本地执行build命令,把构建产出的文件、
package.json文件上传到服务器的node_server目录,同样执行npm install --production装依赖。
- 如果你写服务端的时候没有配置TypeScript编译、打包工具(webpack/rollup/esbuild这类),完全不需要执行build命令,直接把本地
- 上传完代码需要在DreamHost面板找到Node.js应用配置项,指定服务的启动入口文件(比如你的服务启动文件是
index.js就填对应路径),面板会自动给服务分配运行端口,配置完成后启动服务即可。如果要做同域名访问,可以在面板配置反向代理,把/api开头的请求转发到你的Node服务端口,前端代码里的接口请求地址改成对应路径就行,完全不会和前端静态资源产生冲突。
线上MySQL连接配置修改说明
- 首先明确:数据库连接地址前绝对不要加
http://前缀,MySQL是独立的TCP服务,不走HTTP协议,加了前缀会直接连接失败。另外你提到的地址database.myqsl大概率是拼写错误,以DreamHost数据库面板显示的实际主机地址为准。 - 你本地的数据库连接代码有4项必须修改,另外还有一处语法错误需要修正,参考配置如下:
const app = express() // 优先读取主机给Node应用分配的环境变量端口,不要硬编码固定端口 const port = process.env.PORT || 5000 app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json()) // 线上环境不要全量放开跨域,只配置你自己的前端域名即可 app.use(cors({ origin: '你的线上站点访问域名' })) // MySQL连接池配置 const pool = mysql.createPool({ connectionLimit: 10, // 替换为你在DreamHost数据库面板创建的专属数据库账号,线上不要用root账号 user: "线上数据库专属账号", // 替换为面板显示的数据库主机地址,注意不要加http前缀,同时修正你本地代码这里少闭合单引号的语法错误 host: '面板显示的数据库主机地址', // 替换为该数据库账号对应的设置密码,线上数据库不可能是空密码 password: "数据库账号对应密码", // 替换为你在线上创建的数据库名称,不要沿用本地的mydatabase database: "线上数据库名称" })
- 额外注意几个容易踩的坑:
- 你本地代码里
host: 'localhost,这行末尾漏了单引号,线上写配置的时候一定要修正这个语法错误,不然服务启动直接报错。 - DreamHost的数据库默认有访问白名单限制,你需要在数据库面板把Node服务所在的服务器IP加到允许访问的列表里,否则就算配置全对也会被防火墙拦截连接。
- 本地的数据库表结构和初始数据,要先导出成.sql格式文件,再通过线上的PhpMyAdmin导入到对应的线上数据库,不然代码连通数据库后也会报表不存在的错误。
- 数据库账号、密码这类敏感信息尽量不要硬编码在代码里,优先通过服务器环境变量读取,避免源码泄露导致数据库被入侵。
- 你本地代码里
内容的提问来源于stack exchange,提问作者user18150656
相关产品推荐
相关产品推荐

