Node.js服务器7次删除后无响应,求自动重启实现方案
Node.js日记应用删除请求限制问题与自动重启实现方案
问题说明
开发的Node.js日记应用,新增记录功能可无限正常使用,但删除记录操作最多执行7次后就无法发起请求;重启服务器后功能恢复正常。同时需要了解Node.js是否有自动重启机制,并实现服务器处理7次请求后自动重启。
先解决删除请求失效的核心问题
你遇到的7次后无法请求的根本原因是服务器在处理删除请求时没有返回响应,导致客户端的fetch请求一直处于挂起状态。浏览器对同一个域名的并发请求有默认限制(比如Chrome是6个),累计到7个时就会阻塞新的请求。另外你的删除操作根本没有执行数据库删除逻辑,只是打印了日志。
修复后的Server.js代码
"use-strict"; const express = require('express'); // 修正原代码里的拼写错误exrpress const app = express(); const DataStore = require('nedb'); const allData = new DataStore('data.db'); allData.loadDatabase(); app.listen(3000, 'localhost', ()=>{console.log("监听端口3000")}); app.use(express.static('public')); app.use(express.json({limit: '10mb'})); app.get('/api', (request, response)=>{ allData.find({},(error, data)=>{ if(error){ console.error(error); response.status(500).end(); } else { response.json(data); } }); }); app.post('/api', (request, response)=>{ console.log("收到请求..."); const data = request.body; // 直接判断action字段,比遍历Object.values更准确 if (data.action === "löschen"){ console.log("执行删除操作"); // 新增数据库删除逻辑 allData.remove({ timestamp: data.timestamp }, {}, (err, numRemoved) => { if (err) { console.error(err); response.status(500).json({ success: false }); } else { console.log(`删除了${numRemoved}条记录`); response.json({ success: true, numRemoved }); } }); } else { const timestamp = Date.now(); data.timestamp = timestamp; allData.find({datum: data.datum}, function(error, store){ if(error){ console.error(error); response.status(500).json({ success: false }); return; } if(store.length < 1){ allData.insert(data, (err) => { if (err) { console.error(err); response.status(500).json({ success: false }); } else { response.json(data); } }); } else { // 已有相同日期的记录,返回明确提示 response.json({ success: false, message: "该日期已有记录" }); } }); } });
Node.js服务器自动重启实现
Node.js本身没有内置的自动重启机制,但可以通过代码手动实现,满足“处理7次请求后重启”的需求。
按请求次数重启的实现代码
在Server.js中添加请求计数器,达到指定次数时关闭当前服务器并重启进程:
"use-strict"; const express = require('express'); const app = express(); const DataStore = require('nedb'); const allData = new DataStore('data.db'); const { fork } = require('child_process'); // 用于创建子进程重启服务 allData.loadDatabase(); let requestCount = 0; const MAX_REQUESTS = 7; // 设定最大处理请求数 // 保存服务器实例,用于后续关闭 const server = app.listen(3000, 'localhost', ()=>{console.log("监听端口3000")}); app.use(express.static('public')); app.use(express.json({limit: '10mb'})); // 全局中间件:统计请求次数,达到阈值则重启 app.use((req, res, next) => { requestCount++; console.log(`已处理请求数:${requestCount}`); if (requestCount >= MAX_REQUESTS) { console.log("达到最大请求数,准备重启服务器..."); // 先关闭当前服务器,避免新请求进入 server.close(() => { console.log("当前服务器已关闭"); // 通过fork重启当前进程 fork(process.argv[1]); // 退出当前进程 process.exit(); }); } next(); }); // 以下是修复后的GET和POST接口代码(和上面的修复版一致) app.get('/api', (request, response)=>{ allData.find({},(error, data)=>{ if(error){ console.error(error); response.status(500).end(); } else { response.json(data); } }); }); app.post('/api', (request, response)=>{ console.log("收到请求..."); const data = request.body; if (data.action === "löschen"){ console.log("执行删除操作"); allData.remove({ timestamp: data.timestamp }, {}, (err, numRemoved) => { if (err) { console.error(err); response.status(500).json({ success: false }); } else { console.log(`删除了${numRemoved}条记录`); response.json({ success: true, numRemoved }); } }); } else { const timestamp = Date.now(); data.timestamp = timestamp; allData.find({datum: data.datum}, function(error, store){ if(error){ console.error(error); response.status(500).json({ success: false }); return; } if(store.length < 1){ allData.insert(data, (err) => { if (err) { console.error(err); response.status(500).json({ success: false }); } else { response.json(data); } }); } else { response.json({ success: false, message: "该日期已有记录" }); } }); } });
注意事项
- 这种按请求次数重启的方式仅适合特定测试场景,生产环境不建议使用,会导致服务中断,正在处理的请求可能失败。
- 如果是开发环境需要自动重启(比如代码变更后),可以使用
nodemon工具,但它是基于文件变更触发重启,不是请求次数。
内容的提问来源于stack exchange,提问作者Emirhan
相关产品推荐
相关产品推荐

