为什么我的返回为空(Node.js,unirest)

时间:2017-05-01 19:27:51

标签: node.js unirest

我的Node.js测试设置有问题。我基本上想要一个我可以调用的端点,这个端点可以调用不同的其他端点并给我一个JSON作为响应。当我看一下performRequest函数的控制台输出时,一切看起来都不错。但是这个函数的返回没有通过。我总是得到一个空的{}作为回应。

保存我路线的routes.js:

var s24 = require("./s24");

var routes = function(app) {

  app.get("/ping", function(req, res) {
    res.send("<p>pong</p>");
    console.log("Received GET");
  });

  app.get("/getCategories", function(req, res) {
    var output = s24.getCategories();
    res.type('application/json');
    return res.send(output);
  });

};

module.exports = routes;

查询另一个REST-API的s24.js:

var functions = require('./functions');

var appID = "XYZ";
var authorization = "ABC";

var getCategories = function () {
  var output = functions.performRequest("https://api.s24.com/v3/"+appID+"/categories", authorization);
  console.log(output);
  return output;
};

module.exports.getCategories = getCategories;

包含所有相关功能的functions.js:

var unirest = require('unirest');

var performRequest = function(endpoint,authorization,body) {
  unirest.get(endpoint)
  .headers({'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': authorization})
  .send(body)
  .end(function (response) {
  var data = response.body;
  console.log(data);
  return data;
  });
};

module.exports.performRequest = performRequest;

1 个答案:

答案 0 :(得分:0)

performRequest是一个异步函数,通常在node.js中,你不能只返回异步函数的响应。您可以将async await功能与babel一起使用,但最简单的方法就是使用callbackspromises。 您的代码应如下所示:

var performRequest = function (endpoint, authorization, body, callback) {
  unirest.get(endpoint)
    .headers({
      'Accept': 'application/json',
      'Content-Type': 'application/json',
      'Authorization': authorization
    })
    .send(body)
    .end(function (err, response) {
      var data = response.body;
      callback(data["id"]);
    });
}


var getCategories = function () {
  var output = functions.performRequest(
    "https://api.s24.com/v3/" + appID + "/categories",
    authorization,
    function (output) {
      console.log(output);
    });
};

正如您所看到的,将回复从一个回调转移到另一个回调看起来很难看,所以我建议您重新考虑您的设计。