要求Node.js / Express.js中间件没有方法'...'

时间:2013-12-16 20:25:47

标签: node.js methods express middleware

我在使用Express.js中间件时遇到问题;我的代码在app.'s

...
var middlewares = require('./middlewares');
...
routes = require('./routes')(app, config, crypto, middlewares, models, oauth2);
...

这需要./middlewares/index.js

/*jslint es5: true, indent: 2, node:true, nomen: true, maxlen: 80, vars: true*/

'use strict';

var middlewares = function (app, config, models, oauth2) {
  var that = {};

  that.touch = require('./touch.js')(app, config, models, oauth2);

  return that;
};

module.exports = middlewares;

反过来(上面的内容已经简化,但也需要其他中间件)需要./middlewares/touch.js

/*jslint es5: true, indent: 2, node: true, nomen: true, maxlen: 80, vars: true*/

'use strict';

var touch = function (app, config, models, oauth2) {
  return function (req, res, next) {
    console.log('Touch');

    next();
  };
};

module.exports = touch;

./routes/index.js

调用它
/*jslint es5: true, indent: 2, node:true, nomen: true, maxlen: 80, vars: true*/

'use strict';

var routes = function (app, config, crypto, middlewares, models, oauth2) {
  var that = {};

  app.get(
    '/',
    middlewares.touch(app, config, models, oauth2),
    function (req, res) {
      res.send('Hello world!');
    }
  );

  that.auth = require('./auth')(app, config, crypto, models, oauth2);

  return that;
};

module.exports = routes;

虽然当我这样做时,我收到错误:

TypeError: Object function (app, config, models, oauth2) {
  var that = {};

  that.touch = require('./touch.js')(app, config, models, oauth2);

  return that;
} has no method 'touch'

当我需要来自./middlewares/touch.js的{​​{1}}时:

app.js

... var touch = require('./middlewares/touch.js'); ... routes = require('./routes')(app, config, crypto, touch, models, oauth2); ... 我称之为:

./routes/index.js

我没有错误!必须是我通过/*jslint es5: true, indent: 2, node:true, nomen: true, maxlen: 80, vars: true*/ 'use strict'; var routes = function (app, config, crypto, touch, models, oauth2) { var that = {}; app.get( '/', touch(app, config, models, oauth2), function (req, res) { res.send('Hello world!'); } ); that.auth = require('./auth')(app, config, crypto, models, oauth2); return that; }; module.exports = routes; 引用它的方式,但我可以在我的生活中解决它吗?

任何想法Stack Overflow?

编辑:

好的,那么问题仍然存在;

  • 我想来自./middlewares/index.js
  • 内的require ./middlewares/index.js
  • app.js需要我的所有中间件,例如./middlewares/index.js
  • 我只需要将./touch.js对象传递给其他模块即可访问其方法,例如middlewares可以传递到我的middlewares模块中,我可以像routes
  • 那样引用触摸中间件

非常简单;我希望middlewares.touch()我的所有中间件并将它们传递到路由模块中,如:

require

在以下路线中使用我的中间件:

...
var middlewares = require('./middlewares');
...
routes = require('./routes')(app, middlewares);
...

我应该怎么做?看看这个问题的顶部,看看我现在正在尝试(并且失败),感谢大家的帮助!

此外,模块/*jslint es5: true, indent: 2, node:true, nomen: true, maxlen: 80, vars: true*/ 'use strict'; var routes = function (app, middlewares) { var that = {}; app.get( '/', middlewares.touch, function (req, res) { res.send('Hello world!'); } ); that.auth = require('./auth')(app); return that; }; module.exports = routes; 应该是什么,例如; return模块实际上不需要返回任何内容,或是/应该它?

3 个答案:

答案 0 :(得分:2)

首发: 两个芒果都是正确的

middlewares / index.js在其导出中返回一个函数

并在routes.js中尝试使用该函数的成员触摸,该函数存在,

其次:

看起来你可以为我们提供一些帮助构建你的应用程序,你已经做得非常彻底,但这样做会使组件非常依赖于彼此/应用程序

你注入了依赖项(app,config,crypto,middlewares,models,oauth2,...等) 进入每个模块,而不是让他们得到自己的

在你的app.js中你可能会做类似

的事情
var OAuth2Lib = require('some/path/oauth2');
var oauth2 = new OAuth2Lib(some.config);

并重复所有其他[crypto,cnfig,models,...] 一旦完成,你就运行

routes = require('./routes')(app, config, crypto, middlewares, models, oauth2);

如果您使用构造代码将oahth2变为新模块,则可以在需要时将其设置为需要(将其放入lib/oauth2.js):

var OAuth2Lib = require('some/path/oauth2');
var oauth2 = new OAuth2Lib(some.config);
module.exports = oauth2;

在里面使用它:./middlewares/touch.js

var oauth2 = require('../lib/oauth2');
var config = require('../config/config');
var models = require('../lib/models');

var touch = function (app) {
  return function (req, res, next) {
    console.log('Touch');

    next();
  };
};

module.exports = touch;

现在只剩下应用依赖(如果你需要的话) 小心中间件订单,特别是像cookieParse,bodyParser(express)这样的东西应该在你自己的自定义中间件之前app.use'd

答案 1 :(得分:1)

每个功能都是一个对象。

功能对象middlewares没有方法touch,这是真的。我不确定您要使用此代码实现什么,但touch方法在函数返回中,而不是函数本身的成员。

这在语法:middlwares().touch或直接成员分配方面是有效的 middlwares.touch = ...,然后您可以访问它,但我非常怀疑这是否是您的想法。

答案 2 :(得分:1)

问题是middlewares返回一个函数,该函数在执行时返回一个对象,而不仅仅是像./routes/index.js中那样使用它的对象。

你可以做两件事之一。

1)更改./middlewares/index.js以将module.exports设置为对象文字。

/*jslint es5: true, indent: 2, node:true, nomen: true, maxlen: 80, vars: true*/

'use strict';

var middlewares = {

  touch : require('./touch.js')(app, config, models, oauth2)

};

module.exports = middlewares;

- 或 -

2)在致电之前,将./routes/index.js更改为运行middlewares

/*jslint es5: true, indent: 2, node:true, nomen: true, maxlen: 80, vars: true*/

'use strict';

var routes = function (app, config, crypto, middlewares, models, oauth2) {
  var that = {};

  app.get(
    '/',
    middlewares().touch(app, config, models, oauth2),
    function (req, res) {
      res.send('Hello world!');
    }
  );

  that.auth = require('./auth')(app, config, crypto, models, oauth2);

  return that;
};

module.exports = routes;

我偏向于选项1,但这取决于在构建返回对象之前是否需要在./middlewares/index.js中执行某些操作。

根据您所拥有的代码,选项1似乎符合您的需求。