簡體   English   中英

如何在節點js中使用回調函數返回api響應

[英]How can I use callback function for returning api response in node js

我是回調函數的新手。 實際上,我在節點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,
};

我通過在正文中發送json數據來請求POST請求,如下所示:

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

我的測試結果正確無誤,但我只想返回答復,請在出現問題的地方糾正我。

就像其他回調一樣。 在您的代碼中,您沒有為callback參數傳遞任何內容。 如果這樣做,並使用其參數,則可以編寫響應。 最好不要在post回調期間同步寫入響應(正常且完全正常)。

例如:

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作為第一個參數,並將結果(如果有)作為第二個參數。 例如:

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);                       // ***
        }                                                // ***
    });
});

您只需要傳遞回調函數,就像您在callApi中調用回調函數一樣,但是您沒有將任何回調傳遞給callApi,但是請始終記住將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函數應如下所示:

   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;
         //console.log(body);
         if(!err)
         callback(null,result);
         else {
          callback(err);
          }


    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM