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

如何在Node.js中每次请求后清理响应?解决重复响应问题

嘿,我来帮你拆解下这个服务器的问题,以及怎么修复它!

问题根源:全局变量导致的累加效应

你代码里的promises和domainResultJson是全局变量——它们定义在http.createServer的回调函数外面,服务器启动后就一直存在内存里。每次用户访问你的URL(也就是每次触发请求回调),你都会往这两个全局数组里添加新的内容,而不是重新创建空数组。

举个例子:第一次请求进来,你往promises里加了10个Promise,处理完返回10条结果;第二次请求进来,你又往同一个promises数组里加10个新的,这时候Promise.all会处理总共20个Promise,返回的自然就是第一次的10条加第二次的10条,以此类推,每次刷新都会重复之前的响应内容。

修复方案:把变量移到请求回调内部

只需要把这两个容易“串味”的变量放到请求处理的回调函数里面,这样每次新请求进来,都会重新初始化空数组,彻底避免累加问题。

修改后的完整代码如下:

const start = Date.now();
var http = require('http');
var https = require('https');
var request = require('request');
var apiKey = 'example';

// 端口配置逻辑保持不变
port = process.env.PORT || process.argv[2] || 8080;

let server = http.createServer(function (req, res) {
    // 关键:把这两个变量移到请求内部,每次请求都重新创建空数组
    var domainResultJson = [];
    var promises = [];

    for (var i = 0 ; i < 10 ; i++ ) {
        var domain = 'example-'+i+'.com';
        promises.push(CheckIfDomainAvailable(https, domain, apiKey, domainResultJson));
    }

    Promise.all(promises).then(function(values) {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'text/plain');
        for (var i in values) {
            val = values[i];
            res.write(val);
        }
        res.end();
    }).catch( console.error );

    function CheckIfDomainAvailable(https, domain, apiKey, domainResultJson) {
        return new Promise(function (success, failure) {
            request('https://example.com/api/v1?' + 'apiKey=' + apiKey + '&d=' + domain + '', function (error, response, body) {
                if (!error && response.statusCode == 200) {
                    domainResultJson.push('1');
                    success(body);
                } else {
                    failure(error);
                }
            });
        });
    }
});

server.listen(port, function () {
    console.log('app up on port: ' + port);
});
额外小优化建议
  • 尽量用const/let替代var,比如循环里的var domain改成let domain,避免变量提升带来的潜在问题;
  • 观察到你在CheckIfDomainAvailable里往domainResultJson里push了'1',但后续代码并没有用到这个数组,如果确实没用的话,可以删掉这个变量,减少不必要的内存占用。

内容的提问来源于stack exchange,提问作者Noamway

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:17:14