require()函数抛出未定义的错误

时间:2014-07-23 12:57:14

标签: javascript node.js

作为NodeJS的初学者,这可能很困难,但我无法弄清楚我哪里出错了

我的home.js文件如下

module.exports = function (deps) {
  var sample = require('../lib/sample'), // My own library
      express   = require('express'),
      router    = express.Router();

  router.get('/', function (req, res) {
     op = sample.parse('hi'); // Error here
     res.send(op);
  });

  return router;
 };

在lib文件夹下,我的sample.js代码是

module.exports = function () {

  function parse(text) {
      return 'hello' + text;
  }

  return {
      'sample': {
          'parse': parse
      }
  };
};

但是我在突出显示的行上显示错误undefined is not a function。谁能让我知道我错过了什么?

3 个答案:

答案 0 :(得分:4)

由于您导出了一个函数,sample现在将成为一个函数。您需要显式执行它才能获得相同的对象。所以,你需要做这样的事情

var sample = require('../lib/sample')().sample

现在,require语句返回该函数,我们立即执行它,返回一个具有sample属性的对象。由于您只对sample属性感兴趣,因此我们只获得sample属性。

如果您打算隐藏用户的parse实施,我建议您这样做

function parse(text) {
    return 'hello' + text;
}

module.exports = {
  'parse': parse
};

现在,您只是在对象中导出parse函数,并且需要此模块的代码将能够使用parse函数,就像您在问题中提到的那样。

答案 1 :(得分:1)

您的module.exports计算一个函数,该函数在调用时会产生包含您尝试调用的parse函数的对象,在某些嵌套下。您可以尝试重构sample.js文件,如下所示:

function parse(text) {
    return 'hello' + text;
}

module.exports = {
    parse: parse
};

除非你真的需要你的例子中显示的函数包装。在这种情况下,你必须在导入它的地方解开它,所以像这样:

var sample = require('../lib/sample')().sample

答案 2 :(得分:1)

将您的exports更改为:

module.exports = function () {

  function parse(text) {
      return 'hello' + text;
  }

  return {
      'parse': parse
  };
};