【发布时间】:2017-11-22 02:35:37
【问题描述】:
Stack Overflow 社区,您好。我正在尝试使用 Node HTTP Module 为我的网站提供一个基本的自动完成搜索应用程序,在请求对象上传递新请求的响应(即使用 Node 作为代理,它将转换和重定向服务器内的请求)。
流程基本上是:
客户端浏览器 - 节点 - ElasticSearch - 节点 - 客户端浏览器
我已经开始了:
-
用
http.createServer (function (req,res)收听请求 -
从 req 对象中获取主体,并在带有
http.request(options, function (newReqResponse)的新请求中使用它 -
从该 newReqResponse 对象中获取正文并将其发送回 res 对象上的客户端
问题在于 newReqResponse 的内容总是过时的(在最后输入的字符后面留下痕迹)。即:
- 如果我输入“te”,newReqResponse 的内容对应于我只输入“t”时的内容。
- 如果我输入“test”,它对应于如果我输入“tes”。
等等。
我尝试使用 Node.js 流并使用文件系统模块来写入和读取同步和异步文件,但结果是相同的。这是整个代码图片的示例:
var http = require('http');
var fs = require('fs');
http.createServer(function (req, res) {
var reqBody = '';
var newReqResponseBody = "";
req.on('data', function (chunk) {
reqBody += chunk;
fs.writeFile('reqbody.json', reqBody, function(err) {
if (err) {
throw err;
}
});
var options = {
hostname: '127.0.0.1',
port: 9500,
method: 'GET',
path: '/_search',
headers: { host: 'es',
'content-length': Buffer.byteLength(reqBody),
'content-type': 'application/json',
accept: 'application/json' },
};
var newReq = http.request(options, function (newReqResponse) {
newReqResponse.setEncoding("UTF-8");
newReqResponse.on('data', function (ch) {
newReqResponseBody += ch;
});
newReqResponse.on("end", function() {
fs.writeFile("newReqResponseBody.json", newReqResponseBody, function(err) {
if (err) {
throw err;
}
});
});
});
newReq.on("error", function(err) {
console.log(`problem with request: ${err.message}`);
});
newReq.write(reqBody);
newReq.end();
});
req.on('end', function() {
var responseBody = fs.readFileSync('newReqResponseBody.json', 'utf8');
console.log(responseBody);
res.end(responseBody);
});
}).listen(3000, '127.0.0.1');
是否有解决方法来处理 http 服务器中的请求和响应?如果没有,如果您能给我任何有关如何解决此问题的指示,我将不胜感激。
由于 Node 的计划用途相当基本,我更喜欢坚持使用核心模块,而不是必须从 npm 获取新模块,除非有必要。
提前致谢。
编辑:
我所要做的就是在newReqResponse.on("end") 回调中调用res.end(responseBody),这对我来说完全违反直觉,但是......它确实有效。
【问题讨论】:
标签: node.js http-proxy