本指南详细介绍如何将 Express 应用部署到 CloudBase HTTP 云函数。
HTTP 云函数适合以下场景:
- 轻量级应用:API 服务、微服务
- 间歇性访问:不需要持续运行的应用
- 成本敏感:按请求次数和执行时间计费
- 快速部署:无需容器化配置
| 特性 | 说明 |
|---|---|
| 计费方式 | 按请求次数和执行时间 |
| 启动方式 | 冷启动,按需启动 |
| 端口要求 | 固定 9000 端口 |
| 扩缩容 | 自动按请求扩缩 |
| 运行时 | Node.js 16.x、18.x、20.x |
编辑 bin/www 文件,确保云函数环境使用 9000 端口:
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '9000');
⚠️ 重要提示:CloudBase HTTP 云函数要求应用监听 9000 端口。
创建 scf_bootstrap 文件(无扩展名):
#!/bin/bash
export PORT=9000
npm start为启动脚本添加执行权限:
chmod +x scf_bootstrap确保 package.json 包含正确的启动脚本:
{
"name": "cloudrun-express",
"version": "1.0.0",
"scripts": {
"start": "node ./bin/www",
"dev": "nodemon ./bin/www"
},
"dependencies": {
"express": "^4.18.0",
"morgan": "^1.10.0",
"cookie-parser": "^1.4.6",
"debug": "^4.3.4",
"http-errors": "^2.0.0",
"pug": "^3.0.2"
}
}cloudrun-express/
├── bin/
│ └── www # 启动文件
├── public/ # 静态资源
├── routes/ # 路由文件
│ ├── index.js
│ ├── users.js
│ └── health.js
├── views/ # 视图模板
├── app.js # 应用主文件
├── package.json # 项目配置
├── package-lock.json # 依赖锁定文件
└── scf_bootstrap # 🔑 云函数启动脚本
💡 说明:
scf_bootstrap是 CloudBase 云函数的启动脚本- 设置
PORT=9000环境变量确保应用监听正确端口- 使用
npm start启动应用- 云函数会自动安装
package.json中的依赖
- 登录 CloudBase 控制台
- 选择您的环境,进入「云函数」页面
- 点击「新建云函数」
- 选择「HTTP 云函数」
- 填写函数名称(如:
cloudrun-express) - 选择运行时:Node.js 18.x(或其他支持的版本)
- 提交方法选择:本地上传文件夹
- 函数代码选择
cloudrun-express目录进行上传 - 自动安装依赖:开启此选项
- 点击「创建」按钮等待部署完成
如果需要手动打包:
# 创建部署包(排除云托管相关文件)
zip -r cloudrun-express.zip . -x "node_modules/*" ".git/*" "*.log" "Dockerfile" ".dockerignore"部署成功后,您可以参考通过 HTTP 访问云函数设置自定义域名访问 HTTP 云函数。
访问地址格式:https://your-function-url/
- 根路径:
/- Express 欢迎页面 - 健康检查:
/health- 查看应用状态 - 用户列表:
/api/users- 获取用户列表 - 用户详情:
/api/users/1- 获取特定用户 - 创建用户:
POST /api/users- 创建新用户
# 健康检查
curl https://your-function-url/health
# 获取用户列表
curl https://your-function-url/api/users
# 创建新用户
curl -X POST https://your-function-url/api/users \
-H "Content-Type: application/json" \
-d '{"name":"测试用户","email":"test@example.com"}'A: CloudBase HTTP 云函数要求应用监听 9000 端口,这是平台的标准配置。通过在 scf_bootstrap 中设置 PORT=9000 环境变量来控制端口。
A: 云函数在没有请求时会自动休眠,首次请求时需要冷启动。可以通过以下方式减少冷启动时间:
- 减少依赖包大小
- 使用环境变量缓存配置
- 避免在函数中进行重复的初始化操作
- 合理设置内存配置
A: scf_bootstrap 是云函数的启动脚本,用于:
- 设置环境变量(如 PORT=9000)
- 启动应用程序
- 配置运行时环境
A: 在 CloudBase 控制台的云函数页面,点击函数名称进入详情页查看运行日志。
A: CloudBase 支持 Node.js 16.x、18.x、20.x 等版本,建议使用最新的 LTS 版本。
A: Express 的静态文件中间件会自动处理 public 目录下的静态资源。云函数环境支持静态文件服务。
A:
- 单次执行时间限制(通常为 900 秒)
- 内存限制(128MB - 3008MB)
- 临时磁盘空间限制(512MB)
- 并发请求限制
在 app.js 中添加环境变量支持:
// 检测云函数环境
const isCloudFunction = process.env.CLOUDBASE_FUNCTION;
// 动态端口配置
const port = process.env.PORT || (isCloudFunction ? 9000 : 3000);增强 scf_bootstrap 脚本:
#!/bin/bash
export PORT=9000
export NODE_ENV=production
export TZ=Asia/Shanghai
# 检查依赖
if [ ! -d "node_modules" ]; then
npm install --production
fi
# 启动应用
npm start实现云函数专用的错误处理:
// 云函数错误处理
app.use((err, req, res, next) => {
console.error('CloudFunction Error:', err.stack);
res.status(err.status || 500).json({
success: false,
message: err.message,
timestamp: new Date().toISOString(),
requestId: req.headers['x-scf-request-id'] || 'unknown'
});
});增强健康检查接口:
router.get('/', function(req, res, next) {
res.json({
status: 'healthy',
timestamp: new Date().toISOString(),
framework: 'Express',
deployment: 'HTTP云函数',
version: process.env.npm_package_version || '1.0.0',
node_version: process.version,
memory_usage: process.memoryUsage(),
uptime: process.uptime()
});
});-
scf_bootstrap文件存在且有执行权限 - 端口配置为 9000
- 依赖项在
package.json中正确声明 - 排除不必要的文件(如
Dockerfile、.dockerignore) - 测试本地启动是否正常
- 检查启动脚本语法是否正确
- 验证环境变量配置
- 确认日志输出正常
// 全局变量缓存
let cachedConfig = null;
function getConfig() {
if (!cachedConfig) {
cachedConfig = {
// 配置项
};
}
return cachedConfig;
}# 只安装生产依赖
npm install --production
# 清理不必要的文件
npm prune// 监控内存使用
app.use((req, res, next) => {
const memUsage = process.memoryUsage();
console.log('Memory Usage:', {
rss: Math.round(memUsage.rss / 1024 / 1024) + 'MB',
heapUsed: Math.round(memUsage.heapUsed / 1024 / 1024) + 'MB'
});
next();
});// 启用 gzip 压缩
const compression = require('compression');
app.use(compression());
// 设置缓存头
app.use(express.static('public', {
maxAge: '1d'
}));