gpt4 book ai didi

javascript - Expressjs 同步/异步中间件问题——如何解决?

转载 作者:行者123 更新时间:2023-12-03 22:21:52 25 4
gpt4 key购买 nike

我有一个 Expressjs 路由,它根据请求中的一些 JSON Body 参数执行 db INSERT(使用 Sequelize)。 bodyParser 中间件对主体进行 JSON 模式验证,如果未验证则返回错误。

这里的问题是 bodyparser 中的某些内容正在异步执行,并且我收到错误,例如将空值插入数据库(即使在验证失败后)和 Headers already returned to client 错误。

如何最好地解决这个问题?

路线:

var bodyParser = json_validator.with_schema('searchterm');
router.post('/', bodyParser, function (req, res, next) {
Searchterm.findOrCreate({
where: {searchstring: req.body.searchstring},
defaults: {funnystory: req.body.funnystory},
attributes: ['id', 'searchstring', 'funnystory']
}).spread((searchterm, created) => {
if (created) {
res.json(searchterm);
} else {
res.sendStatus(409);
}
}).catch(next);
});

中间件:
var ajv = new Ajv({allErrors: true});
var jsonParser = bodyParser.json({type: '*/json'});

module.exports.with_schema = function(model_name) {
let schemafile = path.join(__dirname, '..', 'models', 'schemas', model_name + '.schema.yaml');
let rawdata = fs.readFileSync(schemafile);
let schema = yaml.safeLoad(rawdata);
var validate = ajv.compile(schema);
return function(req, res, next) {
jsonParser(req, res, next);
if (!validate(req.body)) {
res.status(400).send(JSON.stringify({"errors": validate.errors}));
}
}
};

最佳答案

您的中间件过早地调用 next;改变:

return function(req, res, next) {
jsonParser(req, res, next);
if (!validate(req.body)) {
res.status(400).send(JSON.stringify({"errors": validate.errors}));
}
}

至:
return function(req, res, next) {
if (!validate(req.body)) {
res.status(400).send(JSON.stringify({"errors": validate.errors}));
}
}

以及您的路线定义:
router.post('/', jsonParser, bodyParser, function (req, res, next) { ... });

关于javascript - Expressjs 同步/异步中间件问题——如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53822792/

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