/path/{?} 可以在 nodejs 的路径中使用吗?
can /path/{?} be used in path in nodejs?
我对 node.js 比较陌生,我正在尝试编写一个路由,如果提到的端点以 /api 开头,它将检查所有用户的授权。
我读它是为了可选值?可以像这样使用 {_id?} 但是否可以像 {?} 那样使用它。
以及如何将这条路线调用到另一条实际执行 GET 方法工作的路线中?
目前方法是这样的
server.route({
method: 'GET',
path: '/api/something/nothing/{_id?}',
handler: function (request, reply) {
Controller.vcontroller.get(request.headers.authorization, request.params, function (err, success) {
console.log(request.headers);
console.log(request.headers.authorization);
if (err) {
reply(func.sendError(err));
} else {
reply(func.sendSuccess(APP_CONSTANTS.STATUS_MSG.SUCCESS.DEFAULT, success)).code(200);
}
});
},
config: {
description: 'desc',
tags: ['api', 'order'],
validate: {
headers: func.authorizationHeaderObj,
params: {
order_id: Joi.string().required().trim(),
_id: Joi.string().optional().trim()
},
failAction: func.failActionFunction
},
plugins: {
'hapi-swagger': {
responseMessages: APP_CONSTANTS.swaggerDefaultResponseMessages
}
}
}
}
});
当我通过端点 /api 时,它应该分别检查所有用户对 GET PUT POST 和 DELETE 的授权。
换句话说,我想要特定于路由的全局授权
你能建议一种实现方法吗?
我不是很清楚我是否理解你的问题,所以我会重申我认为你在问什么,然后再回答。如果我不明白,请澄清。
我认为您要问的是,您是否可以在有人点击以 /api
开头的 URL 路径时进行 运行 检查,可能出于用户授权目的。
答案是,是的,您可以将其合并到一个中间件中(尽管我强烈建议 Passport 满足您的所有身份验证需求。
就是说,如果您使用 Express,那么您可以像这样在路由的开头添加中间件:
app.use('/api', (req, res, next) => {
// trivial implementation, not for production
const users = ['bob', 'mari', 'hasan'];
if (users.indexOf(req.user) >= 0) {
// user is authorized
return next();
}
// Forbidden
return res.sendStatus(403);
});
将它放在其他路线之前,任何以 /api
开头的路线都将首先通过此路线。显然,我假设您已经以某种方式在此处填充了 req.user
,但是如果您按照我的建议使用 Passport,那将为您完成。
要检查对以 /api 开头的端点的所有请求是否已获得授权,您可以使用中间件,即
app.use('/api', (req, res, next) => {
// this uses passport.js for auth, you could use something else
if(req.isAuthenticated()) {
return next();
}else{
return res.status(401).send();
}
});
我对 node.js 比较陌生,我正在尝试编写一个路由,如果提到的端点以 /api 开头,它将检查所有用户的授权。 我读它是为了可选值?可以像这样使用 {_id?} 但是否可以像 {?} 那样使用它。 以及如何将这条路线调用到另一条实际执行 GET 方法工作的路线中?
目前方法是这样的
server.route({
method: 'GET',
path: '/api/something/nothing/{_id?}',
handler: function (request, reply) {
Controller.vcontroller.get(request.headers.authorization, request.params, function (err, success) {
console.log(request.headers);
console.log(request.headers.authorization);
if (err) {
reply(func.sendError(err));
} else {
reply(func.sendSuccess(APP_CONSTANTS.STATUS_MSG.SUCCESS.DEFAULT, success)).code(200);
}
});
},
config: {
description: 'desc',
tags: ['api', 'order'],
validate: {
headers: func.authorizationHeaderObj,
params: {
order_id: Joi.string().required().trim(),
_id: Joi.string().optional().trim()
},
failAction: func.failActionFunction
},
plugins: {
'hapi-swagger': {
responseMessages: APP_CONSTANTS.swaggerDefaultResponseMessages
}
}
}
}
});
当我通过端点 /api 时,它应该分别检查所有用户对 GET PUT POST 和 DELETE 的授权。
换句话说,我想要特定于路由的全局授权
你能建议一种实现方法吗?
我不是很清楚我是否理解你的问题,所以我会重申我认为你在问什么,然后再回答。如果我不明白,请澄清。
我认为您要问的是,您是否可以在有人点击以 /api
开头的 URL 路径时进行 运行 检查,可能出于用户授权目的。
答案是,是的,您可以将其合并到一个中间件中(尽管我强烈建议 Passport 满足您的所有身份验证需求。
就是说,如果您使用 Express,那么您可以像这样在路由的开头添加中间件:
app.use('/api', (req, res, next) => {
// trivial implementation, not for production
const users = ['bob', 'mari', 'hasan'];
if (users.indexOf(req.user) >= 0) {
// user is authorized
return next();
}
// Forbidden
return res.sendStatus(403);
});
将它放在其他路线之前,任何以 /api
开头的路线都将首先通过此路线。显然,我假设您已经以某种方式在此处填充了 req.user
,但是如果您按照我的建议使用 Passport,那将为您完成。
要检查对以 /api 开头的端点的所有请求是否已获得授权,您可以使用中间件,即
app.use('/api', (req, res, next) => {
// this uses passport.js for auth, you could use something else
if(req.isAuthenticated()) {
return next();
}else{
return res.status(401).send();
}
});