У меня есть маршрут Expressjs, который выполняет INSERT в БД (используя Sequelize) на основе некоторых параметров JSON Body в запросе.Промежуточное программное обеспечение 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}));
}
}
};