从app.js传递params到route.js

时间:2015-08-07 15:15:35

标签: javascript node.js express

我有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)?

3 个答案:

答案 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来附加所需的中间件/路由。 (对单元测试很有用)