【问题标题】:How can I use callback function for returning api response in node js如何在节点 js 中使用回调函数返回 api 响应
【发布时间】:2018-06-05 11:12:55
【问题描述】:

我是回调函数的新手。实际上我在节点 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" }

我得到了正确的结果,但我只想返回响应,请纠正我的错误。

【问题讨论】:

  • 先生,您想回复谁?任何功能或用户浏览器/客户端或什么?
  • 在 app.js 文件中。
  • 你使用call.callApi(p1, p2, p3, p4);调用,你的 callApi被声明为function callApi (p1, p2, p3, p4, callback) { ...所以,当你调用函数时只需传递一个回调函数
  • 提示:您在 method.js 中编写的内容没有任何问题...但是回调的“节点约定”是相反的...您这样做callback(result, false); - “公约”将是callback(false, result); - 即fn(error, result) - 这并不重要,但我想我会提到它

标签: javascript node.js rest


【解决方案1】:

您只需要传递回调函数,因为您在 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);
          }


    });
}

【讨论】:

    【解决方案2】:

    就像任何其他回调一样。在您的代码中,您没有为 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 回调样式(或采用 Promise,这会更好):让它传递一个错误或 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);                       // ***
            }                                                // ***
        });
    });
    

    【讨论】:

    • 谢谢@T.J Crowder,我是回调函数的新手。
    猜你喜欢
    • 2018-01-30
    • 2018-02-18
    • 2018-10-06
    • 1970-01-01
    • 2014-11-01
    • 2018-07-15
    • 2021-09-11
    • 2019-03-25
    • 2018-06-30
    相关资源
    最近更新 更多