什么是HTTP Headers
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是HTTP Headers相关的知识,希望对你有一定的参考价值。
HTTP Headers就是HTTP首部,HTTP请求(HTTP请求的方法是POST方法时,POST的参数及内容放在body部分)和HTTP响应大体上都分为HTTP首部和HTTP主体(RFC2616文档叫body)。HTTP协议规定,HTTP首部和HTTP主体之间是以一个空行分割的,HTTP首部由一个个字段构成每一行是一个字段,什么叫每一行呢:以\r\n这两个字符(反斜杠是转义字符)结束的就是一行,换句话说\r\n两个字符是一行的结束符。
因为HTTP每一行是以\r\n结束的,所以一个空行的\r\n结束符,再加上一行也就是最后一个字段的结束符\r\n,一起是\r\n\r\n,也就是说,当检测到\r\n\r\n四个字符时,下一个字符开始就是HTTP body的内容了,而\r\n\r\n的前面都是HTTP首部的内容。HTTP首部的字段有很多很多,而且HTTP请求首部和HTTP响应首部的字段是不一样的,每个字段的含义可以参见RFC2616文档,因为RFC文档是英文的,推荐你可以参考一下图解HTTP这本书,可以下载一个PDF电子书浏览一下。 参考技术A HTTP Headers是HTTP请求和相应的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息。 参考技术B 超文本传输头协议
为啥我不断收到“错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头”错误?
【中文标题】为啥我不断收到“错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头”错误?【英文标题】:why do i keep getting 'Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client' error?为什么我不断收到“错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头”错误? 【发布时间】:2022-01-15 21:56:46 【问题描述】:好的,我对 node js 还很陌生,我正在学习用户身份验证。我不断收到“错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头”错误。有人能告诉我我的代码有什么问题以及如何解决吗?当我在邮递员中测试它时,注册路线有效,它的登录路线给了我这个问题。这是我的代码:
const User = require('../models/User')
const CryptoJS = require("crypto-js");
const jwt = require("jsonwebtoken");
const BadRequestError, UnauthenticatedError = require('../errors')
const Register = async (req, res)=>
const newUser = new User(
username: req.body.username,
email: req.body.email,
password: CryptoJS.AES.encrypt(req.body.password, process.env.pass_secret ).toString(),
);
if(newUser)
const savedUser = await newUser.save();
res.status(201).json(savedUser);
const Login = async (req, res) =>
const username = req.body
//checking if both the email and password are provided
if(!username)
throw new BadRequestError('please provide a username and password')
//finding a user with the email, if the user doesnt exist, return an error
const user = await User.findOne(username: req.body.username);
if(!user)
throw new UnauthenticatedError('Invalid username or password')
//checking if the passwords match
const hashedPassword = CryptoJS.AES.decrypt( user.password, process.env.pass_secret);
const originalPassword = hashedPassword.toString(CryptoJS.enc.Utf8);
if(originalPassword !== req.body.password)
throw new UnauthenticatedError('Invalid email or password')
const accessToken = jwt.sign( id: user._id, isAdmin: user.isAdmin, process.env.jwt_secret, expiresIn:"30d");
const password, ...others = user._doc;
res.status(200).json(...others, accessToken);
module.exports = Register, Login
【问题讨论】:
【参考方案1】:无论你有这个:
if(newUser)
const savedUser = await newUser.save();
res.status(201).json(savedUser);
您需要将其更改为:
if(newUser)
const savedUser = await newUser.save();
res.status(201).json(savedUser);
return;
您不希望代码在完成后继续运行
res.status(201).json(savedUser);
因为它会尝试发送另一个响应。
此外,你到处都有这个:
if (err) throw err;
在异步回调中,您需要将其替换为实际发送错误响应的内容,例如:
if (err)
console.log(err);
res.sendStatus(500);
return;
【讨论】:
对不起,我忘了提到注册路线工作正常。当我使用注册路由创建用户后尝试登录时,我得到了该错误。我不知道这是否会影响你的回答。 我认为在Login函数末尾添加return语句可以解决错误以上是关于什么是HTTP Headers的主要内容,如果未能解决你的问题,请参考以下文章
带有 com.sun.net.httpserver 的 CORS