在Express.js中外部化route.param()调用
externalizing route.param() calls in Express.js
我想将一些重复的代码提取到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.js
和users.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=拦截器;
相关文章:
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 如何从Java/scala调用js美化程序
- 如何调用这个匿名 JavaScript 函数
- 如何从模块链中调用函数.导出到节点中
- 我需要从php调用javascript或jquery
- Chrome开发工具(如何知道我在调用哪个javascript对象)
- 单击按钮后如何逐个调用分区,上一个分区将隐藏
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- Twitter Bootstrap typeahead:使用“this”获取上下文/调用元素
- node.js:setInterval()正在跳过调用
- 如何在单击复选框后调用控制器方法
- 如何在JQuery函数中定义一个值,然后调用另一个函数并使用该值
- Angularjs:错误:'追加'对未实现接口FormData的对象调用.jQuery.param/ad
- Ajax在Spring中使用@modelAttribute调用param
- 在Express.js中外部化route.param()调用
- 如何:如果调用了函数(param),则将unforeunload调用绑定到窗口
- SailsJS: POST请求在调用req.param()和req.file()时无法正确解析
- 获取Ajax调用成功后传递的Param值
- Angularjs:在change event时,从指令下拉菜单中调用带有param的控制器方法