gpt4 book ai didi

Node.js 中间件组织和参数验证

转载 作者:搜寻专家 更新时间:2023-10-31 22:20:18 25 4
gpt4 key购买 nike

我正在构建一个快速应用程序,我想知道我可以使用中间件获得多棒的效果。粗略地说,我想用中间件完成以下任务。

完成:

  • 为所有路由添加requestId
  • 验证请求
  • 检查用户是否有权访问给定资源(除了身份验证)

未完成:

  • A) 验证给定路线的参数
  • B) 如果路由与路由不同,则以合理的方式组织中间件,每个路由例行调用 3 个中间件

我已经在一个单独的文件中定义了我的中间件,并将其导入到 app.js 中,如下所示:

var middleware = require('./middleware');
var requestId = middleware.requestId;
var authenticate = middleware.authenticate;

为了将它应用到所有路由,我将它添加到快速配置中:

var app = express.createServer();
app.configure(function () {
app.use(express.logger());
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(requestId); // add requestId to all incoming requests
});

对于路由细节,我将其添加为 app.get 参数:

var routes = require('./v1/routes');
app.get("/v1/foo", routes.foo);
app.get("/v1/bar", authenticate, routes.bar);

问题A

我很想拥有可以用来检查参数的中间件

validate('x','y','z')

对于给定的路线,像这样使用它:

app.get("/v1/bar", authenticate, validate('x','y','z'), routes.bar);

有什么好的方法吗?或者我应该只在路由定义文件中基于每个路由进行验证?

问题B

有没有更好的方法来组织和使用我应该考虑的中间件?

更新

我正在寻找一种方法来验证路由之间变化很大的参数。下面显然不起作用——我不能将参数传递给中间件——但是有什么方法可以定义执行此操作的中间件并按照我上面所说的那样调用它?

var validateParams = function (req, res, params, callback) {
// Make sure the required parameters are in the request
console.log('checking for params '+params);
for (var i = 0; i < params.length; i++) {
var param = params[i];
if(!(param in req.query)){
logger.info('cannot find param ['+param+'] in req: '+JSON.stringify(req.query));
res.writeHead(400, {
"Content-Type": "application/json"
});
var out = {
"err": "request missing required parameters"
};
res.end(JSON.stringify(out));
return;
}
}
callback();
}

最佳答案

问题A

app.get("/v1/bar", authenticate, validate, routes.bar);

function validate(req,res,next){

//Get all parameters here by req.params and req.body.parameter
//validate them and return.
if(validation_true)
next()
}

问题B

您可以以一种不需要总是调用身份验证和验证的方式使用中间件,它们会自动调用。但这可能会导致困惑,例如。然后您的中间件将在每次调用时运行,因此对于 SIGNUP/REGISTER 运行身份验证没有意义。

使用验证,有时您需要验证电子邮件,有时需要验证电话号码。所以两者不能同时进行。

所以对我来说,在每次通话中单独使用它们似乎是最好的方式。

关于Node.js 中间件组织和参数验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12549256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com