REST调用始终返回undefined(Node.JS)

时间:2015-03-17 10:25:47

标签: javascript node.js rest

我还是Node.JS的新手,我正在尝试使用GET方法调用REST API。 我使用此link中的“请求”包。该调用实际上有效但当我尝试从其他.JS文件返回响应主体时,我得到'未定义'。

这是我的'first.js'

var request = require('request');
var first = function (){
};
first.prototype.getValue = function (value){
    var thpath = somePath + value;
    var postheaders = {
        'Content-Type': 'x-www-form-urlencoded'
    };
    var options = {
        url : 'https://' + thpath,
        method : 'GET',
        headers : postheaders,
    };
    var data_rec = "";
    request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            data_rec = JSON.parse(body);
            console.info(data_rec);
            return data_rec;
        } else return "failed to get";
    });
};
module.exports = first;

这是我的'second.js'

var first = require('./first');
var instance = new first();
var val1 = instance.getValue(someValue);
console.info(val1);

'first.js'中的'console.info(data_rec)'返回一个JSON(这意味着该调用正在运行)。但是,'second.js'中的'console.info(val1)'返回'undefined'。任何人都可以找到解决方案吗?

更新: 我可以使用sync-request包来获得解决方案。

2 个答案:

答案 0 :(得分:0)

var val1 = instance.getValue(someValue);
console.info(val1);

instance.getValue是一种异步方法。意思是javascript vm不会等待响应,它继续下一行,即console.info(val1); Ajax请求需要时间,响应只在一段时间后进入,并触发成功函数。然后val1未定义

request(options, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        data_rec = JSON.parse(body);
        console.info(data_rec);
        return data_rec;
    } else return "failed to get";
});

在成功函数中看到console.info(data_rec);,成功函数是在成功检索到响应后调用的函数

答案 1 :(得分:0)

您尝试以同步方式返回异步响应,这是不可能的。 当您拨打电话时,执行first()并返回没有值,然后异步调用完成。因此console.log打印正确,但您无法收到该值。

修改此部分代码

request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            data_rec = JSON.parse(body);
            console.info(data_rec);
            return data_rec;
        } else return "failed to get";
    });

到这个

var request = request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            data_rec = JSON.parse(body);
            console.info(data_rec);
        }
    });
return request.then(function (res) {
    if (res.statusCode >= 300) {
      return "failed to get";
    } else {
      return res.body.toString()
    }
  })