Готовлю бизнес логи c чек, но не получится - PullRequest
0 голосов
/ 28 февраля 2020

Итак, я создаю веб-приложение с узлом, express и mon go (пока нет внешнего интерфейса) и пытаюсь проверить, что регистрирующийся пользователь не использует электронную почту, которая уже использовалась следующим образом:

const existsTatuador = (db, tatuador) =>{
return new Promise((resolve, reject)=>{
        tatuadorDB.findTatuador(db, docs => {
            docs.forEach(element => {
                if(element.correo == tatuador.correo){
                    reject(Error("lo logro, el hijo de puta lo logro"));
                }
            });
        });
    });

}

router.post('/', function(req, res, next){
mongo.getDatabase(db =>{
    tatuadorLogic.existsTatuador(db, req.body).then(
        tatuadorDB.insertTatuador(db, data =>{
            console.log("Inicia el proceso para crear el tatuador :" );
            console.log(req.body);
            res.send(req.body);
        }, req.body)
    ).catch((err)=>{
        console.log(err);
        res.send(err);
})});

});

Но по какой-то причине, когда вызывается отклонение обещания, оно отправляется в блок catch после выполнения .then () и я получаю сообщение об ошибке [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту

1 Ответ

0 голосов
/ 28 февраля 2020

Я вижу несколько проблем:

  1. Вы не решаете свое обещание в existsTatuador().
  2. .then() требуется передать ссылку на функцию, а не результат выполнения вашей функции.
  3. tatuadorDB.insertTatuador() не имеет никаких средств для возврата ошибки, но, похоже, это операция с базой данных, которая может иметь ошибку.
  4. У вас очень мало проверка целостности данных для того, что передается в req.body, который, поскольку он исходит от неизвестного клиента, может быть буквально любым.

Первые две проблемы можно исправить с помощью этого:

const existsTatuador = (db, tatuador) =>{
    return new Promise((resolve, reject)=>{
        tatuadorDB.findTatuador(db, docs => {
            for (let element of docs) {
                if (element.correo == tatuador.correo) {
                    reject(Error("lo logro, el hijo de puta lo logro"));
                    return;
                }
            }
            resolve();
        });
    });
}

router.post('/', function(req, res, next){
    mongo.getDatabase(db => {
        // this next line shows a fix to how the function is passed to .then()
        tatuadorLogic.existsTatuador(db, req.body).then(() => {
            tatuadorDB.insertTatuador(db, data => {
                console.log("Inicia el proceso para crear el tatuador :" );
                console.log(req.body);
                res.send(req.body);
            }, req.body);
        }).catch((err)=> {
            console.log(err);
            res.status(500).send(err);
        });
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...