节点模块导出返回未定义

时间:2014-10-10 02:51:37

标签: node.js mocha chai

我正在尝试创建一个节点模块来获取一些帖子,但我收到一个未定义的错误。

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);
  });
});

我错过了什么?

1 个答案:

答案 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正常工作,但这应该会给你一个想法。