我正在编写一个小的javascript应用程序来测试我用express编写的小型HTTP服务器。服务器工作正常,我可以通过浏览器向它发出请求,我可以通过代码向它发出请求,但只能一次。只要我在循环内执行多个请求,它就不再按预期工作。
这是我的小客户端代码:
const http = require('http');
let alphabet = 'abcdefghijklmnopqrstuvwxyz';
let maxLength = 3;
function permutations(perm, position, string) {
if (position == perm.length) {
let username = perm.join('');
// let url = `http://www.google.com`; // Added this in as a sanity test to check that it is not the server.
let url = `http://localhost/${string}${alphabet[i]}`;
let response = http.get(url, response => {
let body = '';
response.on('data', d => body += d);
response.on('end', () => console.log(`${string}${alphabet[i]}: ${JSON.parse(body).exists}`));
});
} else {
for (let i = 0; i < string.length; i++) {
perm[position] = string[i];
permutations(perm, position + 1, string);
}
}
}
for (let length = 1; length <= maxLength; length++) {
let perm = [];
for (let i = 0; i < length; i++) {
perm.push(0);
}
permutations(perm, 0, alphabet);
}
基本上,此代码生成由字母表中定义的字母组成的特定长度的排列,并向服务器发送请求。它应该在回调内部收到响应,但是从不调用回调,我收到以下错误:
Error: connect ENOBUFS 127.0.0.1:80 - Local (undefined:undefined)
at Object.exports._errnoException (util.js:1029:11)
at exports._exceptionWithHostPort (util.js:1052:20)
at connect (net.js:887:16)
at emitLookup (net.js:1016:7)
at GetAddrInfoReqWrap.asyncCallback [as callback] (dns.js:62:16)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:78:10)
但是,如果我将http.get
放在循环之外,调用了回调函数,并且调出我正在寻找的结果,那么GET
会工作<但是我需要它在循环中)。
如果我只是尝试在像谷歌这样的已知工作服务器上执行HTTP http.get
,它也无效。所以我排除了我写的服务器应用程序的任何错误。
为什么agent: false
没有按预期执行?
**更新:**
所以我尝试在options
对象中使用var http = require('http');
console.log(new Date(Date.now()).toISOString() + ' ' + 'Starting server...');
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello!\n');
console.log(new Date(Date.now()).toISOString() + ' ' + 'Responded to request')
}).listen(8080, '127.0.0.1');
,但仍然无效。
更新2:
为了进一步说明nodejs的错误行为,我已经粘贴了我为此示例创建的服务器的新版本:
server.js:
{{1}}
但是,服务器在响应请求时永远不会打印出预期的文本...