如何通过Netlify、Railway等免费服务部署Handlebars(hbs)+Node.js+MongoDB应用?
Node.js + Handlebars + MongoDB 项目免费托管指南
一、Railway App 部署(推荐,对后端支持最友好)
- 前置准备:
- 项目根目录的
package.json里要有正确的start脚本,比如"start": "node app.js",本地能正常启动项目; - 把MongoDB连接字符串改成环境变量读取,比如用
process.env.MONGODB_URI替代硬编码的连接串。
- 项目根目录的
- 部署步骤:
- 登录Railway,新建项目选择「Deploy from GitHub」,授权后选中你的项目仓库;
- 项目导入后,Railway会自动识别Node.js环境,自动安装依赖并尝试启动服务;
- 添加MongoDB连接串:在项目的「Variables」页面,新增环境变量
MONGODB_URI,值可以用Railway自带的免费MongoDB服务(在Marketplace里搜MongoDB添加,直接复制它的连接串),或者用你自己的MongoDB Atlas免费实例连接串; - 部署完成后,Railway会自动分配一个免费域名,也可以在「Settings」里绑定自定义域名。
二、Vercel 部署(适合轻量后端应用)
- 前置准备:
package.json的start脚本配置正确,本地运行正常;- MongoDB连接串通过
process.env.MONGODB_URI读取,避免硬编码。
- 部署步骤:
- 登录Vercel,点击「Add New Project」导入你的GitHub仓库;
- 配置页面里,「Framework Preset」选「Other」,「Build Command」留空(不需要前端构建),「Install Command」用默认的
npm install; - 在「Environment Variables」里添加
MONGODB_URI,填入你的MongoDB连接串; - 点击「Deploy」,等待部署完成后就能用Vercel分配的域名访问,也可以绑定自定义域名。
- 注意:Vercel免费层的Node.js服务有10秒请求时长限制,接口处理复杂的话可能超时,适合轻量应用。
三、Netlify 部署(需适配Netlify Functions)
- 前置准备:
- 安装
serverless-http和@netlify/plugin-nodejs依赖:npm install serverless-http && npm install --save-dev @netlify/plugin-nodejs; - 把MongoDB连接串改成环境变量读取。
- 安装
- 部署步骤:
- 登录Netlify,导入你的GitHub仓库;
- 配置页面里,「Build Command」设为
npm install,「Publish Directory」设为./; - 在「Site settings > Environment variables」里添加
MONGODB_URI; - 项目根目录创建
netlify.toml配置文件:
[[plugins]] package = "@netlify/plugin-nodejs" [[redirects]] from = "/*" to = "/.netlify/functions/server" status = 200- 创建
functions/server.js文件,把你的Express + Handlebars应用改成Netlify Function格式:
const express = require('express'); const path = require('path'); const hbs = require('hbs'); const mongoose = require('mongoose'); const serverless = require('serverless-http'); const app = express(); // 连接MongoDB mongoose.connect(process.env.MONGODB_URI) .then(() => console.log('MongoDB连接成功')) .catch(err => console.error('MongoDB连接失败:', err)); // 配置Handlebars模板 app.set('view engine', 'hbs'); app.set('views', path.join(__dirname, '../views')); hbs.registerPartials(path.join(__dirname, '../views/partials')); // 静态文件和中间件 app.use(express.static(path.join(__dirname, '../public'))); app.use(express.urlencoded({ extended: true })); // 你的路由逻辑,比如首页 app.get('/', (req, res) => { res.render('index', { title: '首页' }); }); // 导出为Netlify Function exports.handler = serverless(app);- 把所有改动提交到GitHub,Netlify会自动部署完成。
- 注意:Netlify免费层每月有10万次Function调用限制,适合访问量不大的应用。
内容的提问来源于stack exchange,提问作者Dede Holsing
相关产品推荐
相关产品推荐

