我有app.js
以下代码,我还有一个名为router.js的文件,它处理请求的这样的帖子/读/等
这是app.js
var express = require('express');
module.exports = function () {
var app = express();
....
require('./router/routes')(app, express);
return app;
};
router.js如下所示
* /
module.exports = function (app, express) {
var appRouter = express.Router();
app.use(appRouter);
appRouter.route('*')
.post(function (req, res) {
handler.dispatch(req, res);
})
.get(function (req, res) {
handelr.dispatch(req, res)
})
有一种很好的方法可以避免传递两个参数(app,express)?
答案 0 :(得分:1)
没有"很好"摆脱app
的过去的方法。 express
你可以"避免"只需在脚本顶部添加var express = require('express');
即可。
另一种选择是导出路由器并将其挂载到父脚本中。例如:
router.js
:
var appRouter = require('express').Router();
appRouter.route('*')
// ...
module.exports = appRouter;
app.js
:
var router = require('./router');
var app = require('express')();
app.use(router);
答案 1 :(得分:1)
您无需传递express
,因为您可以在routes.js
中仅需要它而无需任何额外开销(您已经在app.js中要求它,所以您所获得的只是一个参考同一个对象)。
此外,您的路由器不需要了解应用程序。实际上,从routes.js
返回路由器并从app.js
使用路由器更有意义。这被称为“关注点分离”; app.js
处理app
的创建和修改,而routes.js
处理路由的创建和修改。
<强> app.js 强>
var express = require('express');
var routes = require('./router/routes');
module.exports = function () {
var app = express();
app.use(routes);
return app;
};
<强> router.js 强>
var express = require('express');
module.exports = function () {
var appRouter = express.Router();
appRouter.route('*')
return appRouter;
};
答案 2 :(得分:0)
是的,更改文件结构的方式,这样您就可以只需要app和express。现在,您不再需要在函数中包装每个模块或传递任何参数。
<强> app.js 强>
var express = require('express');
var app = express();
module.exports = app;
app.boot = function () {
// require in middleware, routes, etc, then start listening.
require('./middleware');
require('./routes');
// middleware that comes after routes, such as error handling
require('./middleware/after');
app.listen();
}
if (require.main === module) {
//move execution to next tick so we can require app.js in other modules safely
process.nextTick(app.boot);
}
<强> routes.js 强>
var express = require('express');
var app = require('./app');
var appRouter = express.Router();
app.use(appRouter);
appRouter.route('*');
appRouter.get('/foo', function () {...});
appRouter.post('/foo', function () {...});
module.exports = appRouter; // for unit testing, or you can use this to attach it in app.js instead.
此外,通过将引导功能附加到app
,您现在可以将此应用程序包含到另一个快速应用程序中,并在需要时将其作为路由器附加,而无需进行任何更改。所有你需要做的就是需要它,附加它,然后执行app.boot来附加所需的中间件/路由。 (对单元测试很有用)