错误 [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]