我正在尝试创建一个节点模块来获取一些帖子,但我收到一个未定义的错误。
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 :(得分: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
正常工作,但这应该会给你一个想法。