You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 20:24:53