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

Posted

技术标签:

【中文标题】错误 [ERR_HTTP_HEADERS_SENT]:在尝试使用 knex 进行验证和插入时,无法在将标头发送到客户端后设置标头【英文标题】:Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client while trying to validate and insert with knex 【发布时间】:2019-06-13 12:05:15 【问题描述】:

我正在尝试使用 Joi 验证输入表单,然后执行插入。 我以为我是先获取数据,然后在插入数据库之前进行验证。

在插入之前,我决定 console.log 结果但得到了这个错误。

也有人可以推荐一个安全包。我听说过 Helmet,但我不知道如何应用于我的代码。谁能给我看看

[对象:空原型] 书名:'dswdgefg',摘要: 'dstsdtgdrtfy\r\n',isbn:'234325435',选择: '水果' [对象:空原型] 书名:'dswdgefg', 摘要:'dstsdtgdrtfy\r\n',isbn:'234325435', 选择:“水果” 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:\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】:

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

)

【讨论】:

谢谢,当我按照您的建议添加“返回”时。控制台错误不再显示,但我仍然在页面上看到“发生错误”。所以我更改了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"); 之类的代码,那是我“成功添加”的时候 我发现了错误在哪里。有一个选择字段,我也将其命名为 select,但不接受选择名称。我改了名字,一切顺利。谢谢

以上是关于错误 [ERR_HTTP_HEADERS_SENT]:在尝试使用 knex 进行验证和插入时,无法在将标头发送到客户端后设置标头的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不断收到“错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头”错误?

错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法删除标头

Express.js 中的新 Mongoose Schema `ERR_HTTP_HEADERS_SENT` 错误

Firebase - Node.js - Express - 错误 [ERR_HTTP_HEADERS_SENT]

错误 [ERR_HTTP_HEADERS_SENT] 在将标头发送到客户端后无法设置标头

错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头