错误[ERR_HTTP_HEADERS_SENT]:在尝试通过knex进行验证和插入时,无法在将标头发送到客户端后设置标头

时间:2019-01-19 12:51:42

标签: javascript node.js express knex.js joi

我正在尝试通过Joi验证输入表单,然后执行插入操作。 我以为我要先获取数据,然后在插入数据库之前进行验证。

在插入之前,我决定将console.log结果记录下来,但出现此错误。

也有人可以建议一个安全软件包。我听说过头盔,但我不知道如何将其应用于我的代码。有人可以告诉我

  

[对象:空原型] {书名:“ dswdgefg”,摘要:   'dstsdtgdrtfy \ r \ n',isbn:'234325435',选择:   '水果'} [对象:空原型] {书名:“ dswdgefg”,
  摘要:'dstsdtgdrtfy \ r \ n',isbn:'234325435',
  select:'Fruits'} POST / addbooks 200 23.899 ms-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:\ Users \ 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 \ Node \ 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");

    })

}

谢谢

1 个答案:

答案 0 :(得分:0)

发生错误时,您首先要发送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");

})