Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту при попытке проверки и вставки с помощью knex

Я пытаюсь проверить форму ввода с помощью Joi, а затем выполнить вставку. Я думал, что сначала нужно получить данные, а затем проверить их перед вставкой в ​​db.

Перед вставкой я решил записать в console.log результат, но получил эту ошибку.

Также может кто-нибудь предложить пакет для безопасности. Я слышал о Helmet, но не знаю, как применить его к своему коду. Кто-нибудь, пожалуйста, покажите мне

[Объект: нулевой прототип] {название книги: 'dswdgefg', краткое содержание: 'dstsdtgdrtfy \ r \ n', isbn: '234325435', выберите: 'Фрукты'} [Объект: нулевой прототип] {название книги: 'dswdgefg',
сводка: 'dstsdtgdrtfy \ r \ n', isbn: '234325435',
select: 'Fruits'} POST / addbooks 200 23,899 мс - 16 Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту на ServerResponse.setHeader (_http_outgoing.js: 482: 11) в ServerResponse.header (C: \ Users \ dokunbam \ Documents \ Node \ crudlist \ node_modules \ express \ lib \ response.js: 767: 10) в ServerResponse.send (C : \ Users \ dokunbam \ Documents \ Node \ crudlist \ node_modules \ express \ lib \ response.js: 170: 12) по завершении (C: \ Users \ dokunbam \ Documents \ Node \ crudlist \ node_modules \ express \ lib \ response. js: 1004: 10) в tryHandleCache (C: \ Users \ dokunbam \ Documents \ Node \ crudlist \ node_modules \ ejs \ lib \ ejs.js: 257: 5) в View.exports.renderFile [как движок] (C: \ Пользователи \ dokunbam \ Documents \ Node \ crudlist \ node_modules \ ejs \ lib \ ejs.js: 480: 10) в View.render (C: \ Users \ dokunbam \ Documents \ Node \ crudlist \ node_modules \ express \ lib \ view.js: 135: 8) в tryRender (C : \ Users \ dokunbam \ Documents \ Node \ crudlist \ node_modules \ express \ lib \ application.js: 640: 10) в Function.render (C: \ Users \ dokunbam \ Documents \ Node \ crudlist \ node_modules \ express \ lib \ application.js: 592: 3) в ServerResponse.render (C: \ Users \ dokunbam \ Documents \ Node \ crudlist \ node_modules \ express \ lib \ response.js: 1008: 7) в C: \ Users \ dokunbam \ Documents \ Узел \ crudlist \ app.js: 41: 7 в Layer.handle_error (C: \ Users \ dokunbam \ Documents \ Node \ crudlist \ node_modules \ express \ lib \ router \ layer.js: 71: 5) в trim_prefix (C: \ Users \ dokunbam \ Documents \ Node \ crudlist \ node_modules \ express \ lib \ router \ index.js: 315: 13) в C: \ Users \ dokunbam \ Documents \ Node \ crudlist \ node_modules \ express \ lib \ router \ index .js: 284: 7 в Function.process_params (C: \ Users \ dokunbam \ Documents \ Node \ crudlist \ node_modules \ express \ lib \ router \ index.js: 335: 12) в следующий (C: \ Users \ dokunbam \ Documents \ Node \ crudlist \ node_modules \ express \ lib \ router \ index.js: 275: 10)

Это мой код

exports.addbooks = function (req, res)
{
    const bookname = req.body.bookname;
    const summaries = req.body.summaries;
    const isbn = req.body.isbn;
    const category = req.body.select;

    const schema = Joi.object().keys({
        bookname: Joi.string().trim().min(6).max(25).required(),
        summaries: Joi.string().trim().required(),
        isbn: Joi.number().required(),
        category: Joi.string().trim().required()

    });
    Joi.validate(req.body, schema, (err, result) => {
        if(err){
            console.log(result)
            res.send('an error occured');
        }
        console.log(result)
        //Perform knex insert into db
        res.send("successfully added");

    })

}

Спасибо


person dokunbam    schedule 19.01.2019    source источник


Ответы (1)


При ошибке вы сначала отправляете an error occured, а затем снова отправляете successfully added. Вы не можете этого сделать, вы можете отправить ответ клиенту только один раз.

Вам необходимо остановить выполнение вашего кода после отправки сообщения об ошибке.

Joi.validate(req.body, schema, (err, result) => {
    if(err){
        console.log(result)
        return res.send('an error occured');
    }
    console.log(result)
    //Perform knex insert into db
    res.send("successfully added");

})
person MadWard    schedule 19.01.2019
comment
Спасибо, когда я добавил Return, как вы предложили. Ошибка консоли снова не отображается, но на странице все равно произошла ошибка. поэтому я изменил код, например Joi.validate(req.body, schema, (err, result) => { if(result){ console.log(result) return res.send('successfully added'); }else{ console.log(result) //Perform knex insert into db res.send("an error occured"); }, когда меня успешно добавили - person dokunbam; 19.01.2019
comment
Я обнаружил, где ошибка. Есть поле выбора, которое я назвал также выбором, но имя выбора не принято. Я сменил имя, и все прошло хорошо. Спасибо - person dokunbam; 22.01.2019