0

我正在学习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”时,我只能得到“状态 0”。如果我不做http.request,直接将一个JSON对象应用到ctx.body,就可以在网页上得到正确的状态和数据。我错过了什么?或者有更好的解决方案来解决这个问题?

谢谢!!


编辑:返回 404,如果手动设置为 200,则在响应正文中找不到任何内容。但是里面的调试打印是正确的

res.on('end', function(){})

4

1 回答 1

0

这里的问题如下:在您的async函数中,您正在定义一个回调函数。这将导致您的 404,因为 ascny / await 模式需要承诺......所以你基本上要做的就是将你的包装http.request到另一个返回承诺的功能中。所以像:

// 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():

希望有帮助...

于 2017-03-14T10:20:42.153 回答