加载笔记内容...
加载笔记内容...
在 Node.js 生态中,理解响应(Response)的生命周期是构建健壮 Web 应用的关键。我们将响应过程划分为三个核心阶段:
原生 Node.js 方法:
1res.setHeader('Cache-Control', 'public, max-age=3600');
2res.statusCode = 201;
_headers
对象,在调用 writeHead()
前可任意修改Express 增强方法:
1res.header('X-Powered-By', 'Express');
2res.contentType('application/json');
setHeader
,增加 MIME 类型自动推导charset
设置仅影响 Express 的快捷方法(如 res.send()
)writeHead 的量子跃迁:
1res.writeHead(200, {
2 'Content-Type': 'text/plain',
3 'Set-Cookie': ['session=123']
4});
_header
标记,将 headers 序列化并发送流式写入 vs 批处理:
1// 分块传输
2res.write('Hello');
3setTimeout(() => res.end(' World'), 1000);
4
5// 批处理
6res.send('Hello World');
Transfer-Encoding: chunked
时自动启用分块传输res.send() 的魔法:
1res.send({ message: 'Hello' }); // 自动设置 application/json
2res.send(Buffer.from('data')); // 自动设置 application/octet-stream
渲染引擎集成:
1res.render('index', { title: 'Home' });
重定向模式对比:
1res.redirect('/new-path'); // 302 Found
2res.redirect(301, '/permanent'); // 301 Moved Permanently
头部设置冲突:
1app.use((req, res) => {
2 res.send('Hello');
3 res.setHeader('X-Error', 'Too late!'); // 抛出 Error: Can't set headers after they are sent
4});
解决方案:
高效文件传输:
1// 避免阻塞事件循环
2res.sendFile('/large.zip', {
3 maxAge: 3600000,
4 cacheControl: false
5});
sendfile
系统调用提升传输效率本文示例代码已通过 Node.js 18.x 和 Express 4.x 验证,完整测试用例可在 GitHub 仓库 获取。实践中建议结合 Express 官方文档和 Node.js 性能最佳实践进行方案设计。