can't set headers after they are sent

来源:互联网 发布:中国人口年龄结构数据 编辑:程序博客网 时间:2024/06/05 11:13

今天在学习express框架优美静态路由时,遇到了一个问题:
这里写图片描述
错误显示:can’t set headers after they are sent 不能发送header,因为已经发送过一次了
服务器在处理HTTP请求的时候,会先输出响应头,然后输出主体内容,而一旦输出过一次响应头(比如:执行res.writeHead()或res.write()或res.end()),当我们再尝试通过res.setHeader()或res.writeHead()来设置响应头时(有些方法例如:res.redirect()会调用res.writeHead())就会报错。
当我把res.send()修改为res.end()时,代码就可以成功运行了

那res.send()和res.end()有什么区别嘞?

如果服务器端没有数据返回到客户端 那么就可以用 res.end
但是 如果 服务器端有数据返回到客户端 这个时候必须用res.send ,不能用 res.end(会报错)

摘录了一下res.send()的使用方法:

res.send([body|status], [body])

即既可以直接发送内容,也可以第一个参数状态,第二个参数内容。

如果直接发送内容的话,状态会被自动补全;

③发送的内容:
示例:
res.send(newBuffer(‘whoop’));
res.send({ some: ‘json’ });
res.send(‘some html’);
res.send(404, ‘Sorry, we cannot find that!’);
res.send(500, { error: ‘something blew up’ });
res.send(200);

【1】第一种是发送二进制(binary)内容,当其参数为Buffer(缓冲)时,Content-Type 会被设置为 “application/octet-stream” ,而这个表示其文件后缀(文件类型)是某些类型,具体可以查看:
http://www.w3school.com.cn/media/media_mimeref.asp
而wiki上是这么说的
· application/octet-stream(任意的二进制数据)
也就是说这是一个任意的二进制数据,具体如何解释要看实际情况(比如后缀名),比如他可能是一个img,也可能是一个video。

【2】假如发送字符串,那么将被解释为html文件;
也就是说,Content-Type 默认设置为”text/html”:
例如,发送了一个post,然后我res.send(“aaa”),那么网页将跳转到一个只有文本aaa的页面;

【3】假如参数为Array(数组),或者Ojbect(对象),那么将返回一个JSON;

原创粉丝点击