如何在节点js中使用回调函数返回api响应

时间:2018-06-05 11:12:55

标签: javascript node.js rest

我是回调函数的新手。实际上我在节点js中使用请求模块来获取一些信息。我很困惑如何返回我的响应,因为Javascript本质上是异步的。我有以下代码。 我的app.js代码如下:

var express = require('express');

var app = express();

const request = require('request');

var call = require('./method');
app.use(express.json());

app.post('/call', function(request, response){
    var json = request.body;
    var p1 = json.p1;
    var p2 = json.p2;
    var p3 = json.p3;
    var p4 = json.p4;
    call.callApi(p1, p2, p3, p4);

    //response.send(request.body); 
});
app.listen(3000);

我的函数文件名为method.js,如下所示:

const request = require('request');

function callApi(p1, p2, p3, p4, callback) {

    var api = "http://test.roadcast.co.in:8088/api/route/" + p1 + "/" + p2 + "/" + p3 + "/" + p4;
    console.log(api);
    request(api, function(err, res, body) {
        var result = body;
        return callback(result, false);
        //console.log(body);
        //return result;
    });
}

module.exports = {
    callApi: callApi,
};

我通过在body中发送json数据来请求POST请求,如下所示:

{ "p1":"28.7033129", "p2":"77.1542682", "p3":"28.709637", "p4":"77.291254" }

我正在得到正确的结果,但我想要回复,请在我出错的地方纠正我。

2 个答案:

答案 0 :(得分:3)

就像任何其他回调一样。在您的代码中,您没有为callback参数传递任何内容。如果您这样做并使用其参数,则可以编写响应。没有在post回调期间同步写响应(正常和完全正常)。

E.g:

app.post('/call', function(request, response){
    var json = request.body;
    var p1 = json.p1;
    var p2 = json.p2;
    var p3 = json.p3;
    var p4 = json.p4;
    call.callApi(p1, p2, p3, p4, function(result) { // ***
        response.send(result);                      // ***
    });                                             // ***
});

那就是说,你应该改变你的回调以匹配标准的Node回调样式(或者采用promises,这会更好):让它传递错误或null作为第一个参数和结果(如果有的话)作为第二个。 E.g:

function callApi(p1, p2, p3, p4, callback) {

    var api = "http://test.roadcast.co.in:8088/api/route/" + p1 + "/" + p2 + "/" + p3 + "/" + p4;
    console.log(api);
    request(api, function(err, res, body) {
        return callback(err, body); // ***
    });
}

然后

app.post('/call', function(request, response){
    var json = request.body;
    var p1 = json.p1;
    var p2 = json.p2;
    var p3 = json.p3;
    var p4 = json.p4;
    call.callApi(p1, p2, p3, p4, function(err, result) { // ***
        if (err) {                                       // ***
            // Send error response                       // ***
            // ...                                       // ***
        } else {                                         // ***
            // Send successful response                  // ***
            response.send(result);                       // ***
        }                                                // ***
    });
});

答案 1 :(得分:2)

你需要传递回调函数,因为你在callApi中调用回调函数,但你没有将任何回调传递给callApi.But总是记得将err作为回调函数中的第一个参数。

示例:

app.post('/call', function(request, response){
var json = request.body;
var p1 = json.p1;
var p2 = json.p2;
var p3 = json.p3;
var p4 = json.p4;
call.callApi(p1, p2, p3, p4, function(err,result) {

     if(!err) 
        response.send(result);
    else {
      // do something
    }                      
});                                          

});

你的callApi函数应该是这样的:

enter codfunction callApi(p1, p2, p3, p4, callback) {

var api = "http://test.roadcast.co.in:8088/api/route/" + p1 + "/" + p2 + "/" + p3 + "/" + p4;
console.log(api);
request(api, function(err, res, body) {
      var result = body;
     //console.log(body);
     if(!err)
     callback(null,result);
     else {
      callback(err);
      }


});

}