2014-10-09 82 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