在Express.js中外部化route.param()调用

externalizing route.param() calls in Express.js

本文关键字:param 调用 route 外部化 Express js      更新时间:2023-09-26

我想将一些重复的代码提取到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);

我有多个要使用此参数转换的路由,包括:/users/:user/api/users/:user/checkout/:user/:barcode等,但每个根路由(即用户、api、checkout)都在自己的文件中,我将用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;

/路由/拦截器.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

这是不可能的。

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;

/路由/拦截器.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=拦截器;