如何在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
相关产品推荐
相关产品推荐

