Node中setHeader和writeHead的区别

1,380 阅读2分钟

「本文正在参与技术专题征文Node.js进阶之路,点击查看详情

前言

Hi,掘金的朋友们大家好呀!今天在学习Node的时候发现Node/http中的setHeaderwriteHead很相似,都可以设置响应头部,我们来详细的说说吧!

setHeader

参数

response.setHeader(name, value)
  • name 属性
  • value 属性值
  • 返回 http.ServerResponse 返回响应对象

作用

为响应头部设置单个属性。

注意

  • 只能一个一个设置属性
  • 重复设置一个属性会替换之前的设置
  • 设置包含无效字符的属性字段名称或值将导致抛出 TypeError

示例

reponse.setHeader('Content-Type', 'text/html')
reponse.setHeader('Set-Cookie', ['type=ninja', 'language=javascript'])

重复设置一个属性

// 返回 content-type = text/html1
reponse.setHeader('Content-Type', 'text/html')
reponse.setHeader('Content-Type', 'text/html1')

Snipaste_2022-03-22_23-44-25.png

writeHead

参数

response.writeHead(statusCode, [statusMessage], [headers])
  • statusCode http状态码
  • statusMessage 状态信息(可选)
  • headers | 属性对象或数组(可选)
  • 返回 http.ServerResponse 返回响应对象
  • Snipaste_2022-03-22_23-38-59.png

    作用

    setHeader作用相同

    注意

    • 可以设置多个属性,setHeader只能设置一个
    • 只能调用一次
    • 必须在response.end()之前调用
    • 设置包含无效字符的属性字段名称或值将导致抛出 TypeError

    示例

    因为writeHead返回的是一个ServerResponse对象,我们可以进行链式调用

    const body = 'hello world';
    response
      .writeHead(200, {
        'Content-Length': Buffer.byteLength(body),
        'Content-Type': 'text/plain'
      })
      .end(body);
    

    这里的Content-Length是以字节为单位,而不是字符。Buffer.byteLength()就是来确定正文的长度。

    Nodejs不会检查Content-Length和已经传输的正文长度是否一致

    同时使用setHeader和writeHead

    // 返回 content-type = text/plain
    const server = http.createServer((req, res) => {
      res.setHeader('Content-Type', 'text/html');
      res.setHeader('X-Foo', 'bar');
      res.writeHead(200, { 'Content-Type': 'text/plain' });
      res.end('ok');
    });
    

    writeHead 的优先级比 setHeader 高,并且writeHead只能调用一次,所以在调用时,先考虑好哪些头不常改变后,再调用writeHead

    如果已经调用了setHeader设置标头,那么他会传给writeHead合并

    如果调用了此方法,且还没调用 response.setHeader()),则会直接将提供的标头值写入网络通道且内部不缓存。在标头上 response.getHeader()) 不会产生预期的结果。 如果需要逐步填充标头并在未来进行潜在的检索和修改,则改用 response.setHeader()

    总结

    • setHeader 只能一个一个设置标头,writeHead可以一下设置很多
    • setHeader 可以重复调用,writeHead只能调用一次
    • 同时出现setHeader和writeHead,setHeader会合并到writeHead,并且writeHead优先级高
    • writeHead 可以设状态码和状态信息,setHeader不能设置,只能设置标头

    有哪里不对的,请掘金的大佬们指正。

    能给博主一个赞👍,鼓励一下吗?🥰