2014-10-09 76 views
1

我目前正在尝试创建一个节点模块,并且无法从模块中的函数返回数据。我已经做了一些搜索和阅读,但一直没能弄明白。从节点模块中的函数返回数据

我正在使用请求插件从API中获取一些JSON数据,我想将这些数据返回给我的应用程序使用。这里是我的模块代码:

var express = require('express'); 
var router = express.Router(); 
var request = require('request'); 


exports.zipQuery = function(zip){ 

    request('http://api.smartystreets.com/zipcode?' + 'auth-id=XXXXX' + '&auth-token=XXXXX' + '&zipcode=' + zip, function(err, response, body){ 
    if(!err && response.statusCode == 200){ 
     return body; 
    } else { 
    return 'Error returning data'; 
    } 
    }); 
}; 

下面是我打电话它的模块:

var express = require('express'); 
var router = express.Router(); 
var zip = require('../ziplookup/index'); 

router.get('/', function(req,res){ 
    res.send(zip.zipQuery(46805)); 

}); 

module.exports = router; 

我收到的所有JSON数据很好,但我无法弄清楚如何返回它使用它。目前,当我看着我的控制台时,我只是不确定。

感谢您的帮助!我是一个node/js新手,所以我很感激它!

+0

你在客户端有什么? – xShirase 2014-10-09 21:59:19

回答

0

zipQuery()返回undefined,因为在函数完成之前没有return语句运行。这是因为request是异步的,所以你需要一个回调。

exports.zipQuery = function(zip, callback){ 
    request('http://api.smartystreets.com/zipcode?' + 'auth-id=XXXXX' + '&auth-token=XXXXX' + '&zipcode=' + zip, function(err, response, body){ 
    if(!err && response.statusCode == 200){ 
     callback(null, body); // invoke callback function with the value you want to pass back 
    } else { 
     callback(new Error('Error returning data')); 
    } 
    }); 
} 

// elsewhere 
var zipQuery = require('zipQuery').zipQuery; 

zipQuery(98765, function(error, response) { 
    if (error) { 
    console.log(error) 
    } else { 
    console.log(null, "We got a good response! " + response); 
    } 
}); 
+1

此外,'返回'错误返回数据';'是无用的,因为返回的值几乎总是被异步函数忽略。回调应遵循“错误优先”格式,以便在发生错误时可以传递Error对象(否则为null/undefined)。 – mscdex 2014-10-09 22:18:47

+0

是的,你说得对。更新答案! – 2014-10-09 23:00:59

+0

非常感谢@AlexWayne!这正是我需要的。现在我理解模块好一点了。 – anguiac7 2014-10-10 00:45:15