Expressjs Sync / Асинхронные проблемы промежуточного программного обеспечения - Как это исправить? - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть маршрут 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}));
        }
    }
};

1 Ответ

0 голосов
/ 18 декабря 2018

Ваше промежуточное ПО вызывает 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) { ... });
...