我在使用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
模块实际上不需要返回任何内容,或是/应该它?
答案 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似乎符合您的需求。