可以在nodejs中的路径中使用/ path / {?}吗?

时间:2017-10-03 21:24:11

标签: javascript node.js express hapijs

我对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
                }
            }
        }
    }
});

当我通过endpoint / api时,它应该检查GET PUT POST&的所有用户的授权。分别删除。

换句话说,我想要特定于路线的全球授权

你能建议一种实施方法吗?

2 个答案:

答案 0 :(得分:1)

要检查是否所有对以/ 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();
  }
});

答案 1 :(得分:0)

我并不完全清楚我理解你的问题,所以我会重申我认为你要问的问题然后回答。如果我不理解,请澄清。

我认为您要问的是,当有人点击以/api开头的网址路径时,您是否可以运行支票,可能是出于用户授权目的。

答案是,是的,您可以将其合并到中间件中(尽管我强烈建议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,我建议将为你完成。