2014-10-10 65 views
1

我想創建一個節點模塊來抓取一些帖子,但我得到一個未定義的錯誤。節點模塊導出返回未定義

Index.js

var request = require('request'); 

function getPosts() { 

    var options = { 
    url: 'https://myapi.com/posts.json', 
    headers: { 
     'User-Agent': 'request' 
    } 
    }; 

    function callback(error, response, body) { 
    if (!error && response.statusCode == 200) { 
     return JSON.parse(body); 
    } 
    } 

    request(options, callback); 
} 

exports.posts = getPosts; 

測試/ index.js

var should = require('chai').should(), 
    myModule = require('../index'); 

describe('Posts call', function() { 
    it('should return posts', function() { 
    myModule.posts().should.equal(100); 
    }); 
}); 

我缺少什麼?

+0

'getPosts'不返回任何東西 – naomik 2014-10-10 04:33:40

回答

2

===錯字後編輯已得到糾正===

看起來你實際上並沒有「得到」回調是如何工作的。

您定義的回調將異步激發,所以它實際上不能用於按照您嘗試的方式返回值。實現它的方法是讓getPosts()函數實際接受另一個函數,這是調用代碼關心的回調函數。所以,你的測試將是這個樣子:

describe('Posts call', function(){ 
    it('should have posts', function(done){ 
    myModule.posts(function(err, posts){ 
     if(err) return done(err); 
     posts.should.equal(100); 
     done(); 
    }); 
    } 
}); 

那麼你的模塊代碼將是這樣的,爲了支持:

var request = require('request'); 

function getPosts(callback) { 

    var options = { 
    url: 'https://myapi.com/posts.json', 
    headers: { 
     'User-Agent': 'request' 
    } 
    }; 

    function handleResponse(error, response, body) { 
    if (!error && response.statusCode == 200) { 
     return callback(null, JSON.parse(body)); 
    } 
    return callback(error); // or some other more robust error handling. 
    } 

    request(options, handleResponse); 
} 

exports.posts = getPosts; 

可能有更好的錯誤處理在那裏,喜歡做確定JSON.parse正常,但應該給你這個想法。

+0

對不起,這是一個錯字。我有正確的設置。 – user2270029 2014-10-10 03:20:44