Node.js 本地服务部署、常驻及调用完整笔记
本笔记记录 Node.js 服务的启动、常驻、跨域调用、QPS 限制处理、服务自检及日志管理方法,适合快速查阅和复用。
一、Node 服务启动与访问
- 启动服务
node server.js
特点:直接启动,终端关闭服务会被销毁。
访问示例:
本地访问:http://localhost:3000/ocr
局域网访问:http://127.0.0.1:3000/ocr 或 http://0.0.0.0:3000/ocr
公网访问:http://公网IP:3000/ocr(需放通防火墙端口)
- 常见启动问题
错误 原因 解决方案
net::ERR_CONNECTION_REFUSED 服务未启动或访问地址错误 确认 Node 服务已启动,访问地址与监听地址一致
EADDRINUSE 端口被占用 修改端口或结束占用进程 lsof -i:3000 / kill
二、跨域调用与 QPS 限制处理
- 前端调用 Node 服务示例
async function ocrImage(file, retryCount = 0) {const base64 = await convertImageToBase64(file);try {const res = await fetch("http://117.72.99.159:3000/ocr", {method: "POST",headers: { "Content-Type": "application/json" },body: JSON.stringify({ imageBase64: base64 })});const data = await res.json();// QPS限制重试if (data.error_code === 18 || /qps|limit/i.test(data.error_msg)) {if (retryCount < 5) {const waitTime = 5000 * (retryCount + 1); // 5秒、10秒、15秒...console.log(`QPS限制,等待 ${waitTime/1000} 秒重试 (${retryCount + 1}/5)`);await sleep(waitTime);return await ocrImage(file, retryCount + 1);} else {return { text: "QPS限制,请稍后重试", confidence: 0 };}}const text = data.words_result?.map(w => w.words).join(" ") || "";const confidence = data.words_result?.length > 0? data.words_result.reduce((sum, w) => sum + (w.probability || 0.8), 0) / data.words_result.length: 0;return { text, confidence: Math.round(confidence * 100) };} catch (e) {console.error("Fetch请求失败:", e);}
}
注意:
访问 localhost 仅本机可访问。
访问公网 IP 可实现跨设备访问。
对接口有 QPS 限制需增加重试机制。
三、Node 服务常驻运行
1. 使用 nohup 后台运行
nohup node server.js > server.log 2>&1 &
-
nohup:忽略终端挂断信号,服务持续运行
-
server.log:标准输出写入日志
-
2>&1:标准错误也写入日志
-
&:后台运行
2. 查看和管理进程
查看日志
tail -f server.log
查看 Node 后台进程
ps aux | grep node
停止服务
kill
3. 监听地址区别
地址 | 含义 | 访问范围 |
---|---|---|
localhost/ 127.0.0.1 | 本机回环 | 仅本机访问 |
0.0.0.0 | 监听所有网络接口 | 局域网内可访问 |
公网 IP | 外网访问 | 需开防火墙端口 |
四、服务自检与问题排查
- 自检脚本示例(Node 端)
const http = require('http');function checkService() {http.get('http://127.0.0.1:3000/test-token', res => {if(res.statusCode === 200){console.log('服务运行正常');} else {console.error('服务异常:', res.statusCode);}}).on('error', (e) => {console.error('服务未启动或连接失败:', e.message);});
}// 每5分钟自检一次
setInterval(checkService, 5 * 60 * 1000);
- 常见问题与解决
问题 原因 解决方案
服务断开 进程被意外杀死 使用 nohup 或 PM2 监控
日志爆满 没有轮转机制 配合 logrotate 或 PM2 日志管理
QPS限制 接口请求过快 增加指数退避重试,限制并发请求
防火墙阻塞 公网访问失败 放通 3000 端口或使用 Nginx 反代
五、日志管理建议
日志输出到文件:
nohup node server.js > server.log 2>&1 &
实时查看:
tail -f server.log
日志轮转:
- Linux 可用 logrotate 定期清理
- PM2 内置日志管理功能,可自动分割和备份日志
- 六、总结与优化建议
服务常驻:
- nohup 可用,但日志需管理
- 更推荐使用 PM2 或 Docker 做进程管理与自检
跨域访问:
- 本机开发用 localhost 或 127.0.0.1
- 局域网用 0.0.0.0
- 公网部署需确保 IP、端口、防火墙正确配置
请求限制:
- 对接口 QPS 限制做指数退避重试
- 减少请求压力,提升服务稳定性
服务自检:
- 定时请求自身健康检查接口
- 异常时可结合脚本重启或告警