什么是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

什么是HTTP

什么是HTTP/2?HTTP/2和HTTP/1.1区别是什么?

HTTP是什么?HTTP不是什么?

介绍什么是 HTTP/3,它为什么重要?

什么是HTTP Headers