如何从 http.request 作为 koa 的 ctx.body 获取响应主体?
How to get response body from a http.request as a ctx.body for koa?
我正在学习Node.js,由于某些原因我需要设置一个http.request到另一个ip,并得到它的响应并应用到koa的ctx.body .我这样写代码:
var refreshData = async (ctx, next) =>{
var option = {
host: 'xxx.xxx.xxx.xxx',
port: 8080,
path: '/reqPath',
method: 'POST',
headers:{'Content-Type': 'application/json'}
};
var postData = "1";
var resData = '';
var req = http.request(option, function(res){
res.setEncoding('utf8');
res.on('data', function (chunk) {
resData = resData + 'Chunk: ' + chunk;
});
res.on('end', function(){
ctx.res.body = resData;
console.log('ResponseData: ' + ctx.res.body); //shows the correct data
});
});
req.on('error', function(e){
console.log('problem with request: ' + e.message);
});
req.write(postData);
req.end();
};
module.exports = {
'GET /refreshDataGet': refreshData,
};
正在学习使用控制器映射并且有效,resData 是正确的数据。但是我只能在网页上执行 'GET /refreshDataGet' 时得到 'status 0' 。如果我不做http.request,直接应用一个JSON对象到ctx.body,我就能在网页上得到正确的状态和数据。我错过了什么?或者有更好的解决方案来解决这个问题?
谢谢!!
编辑:
return 404,如果手动设置为200,则在响应正文中找不到任何内容。
但是
中的调试打印是正确的
res.on('end', function(){})
这里的问题如下:在您的 async
函数中,您定义了一个回调函数。这将导致你的 404,因为 ascny / await 模式需要承诺......所以你基本上要做的是将你的 http.request
包装到另一个 returns 承诺的功能中。所以像:
// not tested !!
function getHttpRequest() {
let option = {
host: 'xxx.xxx.xxx.xxx',
port: 8080,
path: '/reqPath',
method: 'POST',
headers:{'Content-Type': 'application/json'}
};
return new Promise((resolve, reject) => {
let postData = "1";
let resData = '';
let req = http.request(option, function(res){
res.setEncoding('utf8');
res.on('data', function (chunk) {
resData = resData + 'Chunk: ' + chunk;
});
res.on('end', function(){
resolve(resData)
});
});
})
}
然后在您的 refreshData
异步函数中,您正在等待解析承诺,例如:
ctx.body = await getHttpRequest():
希望对您有所帮助...
我正在学习Node.js,由于某些原因我需要设置一个http.request到另一个ip,并得到它的响应并应用到koa的ctx.body .我这样写代码:
var refreshData = async (ctx, next) =>{
var option = {
host: 'xxx.xxx.xxx.xxx',
port: 8080,
path: '/reqPath',
method: 'POST',
headers:{'Content-Type': 'application/json'}
};
var postData = "1";
var resData = '';
var req = http.request(option, function(res){
res.setEncoding('utf8');
res.on('data', function (chunk) {
resData = resData + 'Chunk: ' + chunk;
});
res.on('end', function(){
ctx.res.body = resData;
console.log('ResponseData: ' + ctx.res.body); //shows the correct data
});
});
req.on('error', function(e){
console.log('problem with request: ' + e.message);
});
req.write(postData);
req.end();
};
module.exports = {
'GET /refreshDataGet': refreshData,
};
正在学习使用控制器映射并且有效,resData 是正确的数据。但是我只能在网页上执行 'GET /refreshDataGet' 时得到 'status 0' 。如果我不做http.request,直接应用一个JSON对象到ctx.body,我就能在网页上得到正确的状态和数据。我错过了什么?或者有更好的解决方案来解决这个问题?
谢谢!!
编辑: return 404,如果手动设置为200,则在响应正文中找不到任何内容。 但是
中的调试打印是正确的res.on('end', function(){})
这里的问题如下:在您的 async
函数中,您定义了一个回调函数。这将导致你的 404,因为 ascny / await 模式需要承诺......所以你基本上要做的是将你的 http.request
包装到另一个 returns 承诺的功能中。所以像:
// not tested !!
function getHttpRequest() {
let option = {
host: 'xxx.xxx.xxx.xxx',
port: 8080,
path: '/reqPath',
method: 'POST',
headers:{'Content-Type': 'application/json'}
};
return new Promise((resolve, reject) => {
let postData = "1";
let resData = '';
let req = http.request(option, function(res){
res.setEncoding('utf8');
res.on('data', function (chunk) {
resData = resData + 'Chunk: ' + chunk;
});
res.on('end', function(){
resolve(resData)
});
});
})
}
然后在您的 refreshData
异步函数中,您正在等待解析承诺,例如:
ctx.body = await getHttpRequest():
希望对您有所帮助...