外化route.param()调用Express.js

时间:2014-10-02 21:29:41

标签: javascript node.js express routes

我想将一些重复的代码提取到Node.js和Express.js中的单个模块中

Together.js

var express = require('express');
var boom = require('express-boom');
var app = express();
var app.use(boom());    

app.param('user', function(request, reply, next, id){
    request.db.users.get(id, function(err, userInfo){
        if (err) reply.boom.badImplementation(err);
        else if (!userInfo || !userInfo.length) reply.boom.notFound();
        else {
            request.user = userInfo[0];
            next();
        }
    })
})

app.get('/api/users/:user', function(request, reply){
    reply.json(request.user);
});

app.listen(3000);

我想要使用此param转换的多个路由包括:/users/:user/api/users/:user/checkout/:user/:barcode等,但每个根路由(即用户,api,结帐)在他们自己的文件中,我附加app.use('/users', userRoutes);。实际上,我必须将我的用户参数转换为这些子路由模块中的每一个。

我希望有一个interceptors.js,我可以在其中创建所有常见的param拦截器函数,并且只编写一次。以下是我认为它可行的示例。

app.js

var express = require('express');
var app = express();

app.use(require('./routes/interceptors'))

app.use('/users', require('./routes/users'));
app.use('/api', require('./routes/api'));
app.use('/checkouts', require('./routes/checkouts'));

app.listen(3000);

./路由/ api.js

var express = require('express');
var api = express.Router();

api.get('/users/:user', function(request, reply){
    reply.json(request.user);
});

module.exports = api;

./路由/ interceptors.js

var express = require('express');
var boom = require('express-boom');
var interceptors = express.Router();

var interceptors.use(boom());    

interceptors.param('user', function(request, reply, next, id){
    request.db.users.get(id, function(err, userInfo){
        if (err) reply.boom.badImplementation(err);
        else if (!userInfo || !userInfo.length) reply.boom.notFound();
        else {
            request.user = userInfo[0];
            next();
        }
    })
})

module.exports = interceptors;

checkout.jsusers.js当然会有另一个文件,它们与api.js

的主体相同

当我执行上述操作时,param拦截器永远不会运行。我看不到任何错误。

感谢大家提供的任何帮助, Rhett Lowe

1 个答案:

答案 0 :(得分:1)

这不可能。

  

Param回调函数是定义它们的路由器的本地函数。它们不是由已安装的应用程序或路由器继承的。因此,在应用程序上定义的参数回调只能通过应用程序路径上定义的路径参数进行分类。

http://expressjs.com/api.html#app.param

你可以做的另一种方法是在你的路线文件中有一个带有拦截器的模块和require

<强> ./路由/ api.js

var express = require('express');
var api = express.Router();
var interceptors = require('./interceptors');

api.use('user', interceptors.user);

api.get('/users/:user', function(request, reply){
  reply.json(request.user);
});

module.exports = api;

<强> ./路由/ interceptors.js

exports.user = function(request, reply, next, id){
    request.db.users.get(id, function(err, userInfo){
        if (err) reply.boom.badImplementation(err);
        else if (!userInfo || !userInfo.length) reply.boom.notFound();
        else {
            request.user = userInfo[0];
            next();
        }
    })
})

module.exports =拦截器;