怎样使用Node.js处理HTTP?

兄弟姐妹们在线问一下,怎样使用Node.js处理HTTP?
最新回答
旧事酒浓

2026-10-30 08:25:54

Node.js通过内置的http模块和第三方框架(如Express.js)可高效处理HTTP请求,支持服务器端响应和客户端请求,并覆盖多种请求类型及错误处理场景。 以下是具体实现方法:

一、使用http模块创建HTTP服务器

Node.js的http模块可直接创建服务器,监听端口并处理请求:

const http = require('http');const server = http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello, Node.js!');});const port = 3000;server.listen(port, () => { console.log(`Server running at
http://localhost:
${port}/`);});
  • 核心逻辑:createServer方法接收回调函数,参数req(请求对象)和res(响应对象)用于处理请求和返回数据。
  • 响应设置:writeHead定义状态码和响应头,end发送响应体。
二、发起HTTP客户端请求

通过http.request方法发起请求,需配置目标地址、端口、路径和请求方法:

const http = require('http');const options = { hostname: 'www.example.com', port: 80, path: '/', method: 'GET'};const req = http.request(options, (res) => { console.log(`状态码: ${res.statusCode}`); res.on('data', (chunk) => { console.log(`响应主体: ${chunk}`); }); res.on('end', () => { console.log('响应中已无数据。'); });});req.on('error', (error) => { console.error(`请求遇到问题: ${error.message}`);});req.end(); // 必须调用以结束请求
  • 关键点:监听data事件获取响应片段,end事件标记响应结束,error事件处理异常。
三、处理不同HTTP请求类型1. GET请求
  • 参数获取:通过req.url解析URL中的查询字符串(如/path?key=value)。
  • 示例:使用url模块或手动拆分字符串提取参数。
2. POST请求
  • 请求体解析:监听data事件累积数据,end事件触发解析:
const http = require('http');const querystring = require('querystring');const server = http.createServer((req, res) => { if (req.method === 'POST') { let body = ''; req.on('data', (chunk) => { body += chunk; }); req.on('end', () => { const postData = querystring.parse(body); // 解析为键值对 res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify(postData)); }); } else { res.writeHead(405, { 'Content-Type': 'text/plain' }); res.end('Method Not Allowed'); }});
  • 扩展工具:使用body-parser中间件(Express.js场景)简化JSON/表单数据解析。
3. 其他方法(PUT/DELETE)
  • 通过req.method判断请求类型,执行对应逻辑(如数据库更新或删除操作)。
四、错误与异常处理1. 服务器端错误
  • 同步错误:使用try...catch捕获异常,返回500状态码:
const server = http.createServer((req, res) => { try { if (req.url === '/error') throw new Error('Intentional error'); res.end('Success'); } catch (error) { console.error(error); res.writeHead(500); res.end('Internal Server Error'); }});
  • 异步错误:监听error事件处理底层异常(如端口占用)。
2. 客户端错误
  • 在请求对象上监听error事件,处理网络问题或无效URL:
const req = http.request(options, (res) => { /* ... */ });req.on('error', (error) => { if (error.code === 'ENOTFOUND') console.log('域名解析失败');});五、使用Express.js简化开发

Express.js封装了http模块,提供路由、中间件等高级功能:

1. 基础服务器const express = require('express');const app = express();app.get('/', (req, res) => { res.send('Hello, Express.js!');});app.listen(3000);
  • 优势:自动处理请求头、状态码等细节,代码更简洁。
2. 路由与中间件
  • 路由:按方法(get/post)和路径定义处理逻辑:
app.post('/api/data', express.json(), (req, res) => { console.log(req.body); // 自动解析JSON请求体 res.json({ received: true });});
  • 中间件:使用express.json()解析JSON数据,morgan记录日志:
const morgan = require('morgan');app.use(morgan('tiny')); // 启用日志中间件3. 错误处理中间件

集中处理未捕获的错误:

app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('Something broke!');});六、选择建议
  • 轻量级需求:直接使用http模块,适合简单API或学习目的。
  • 复杂应用:选择Express.js或Koa、Fastify等框架,提升开发效率。

通过以上方法,可灵活应对从基础HTTP交互到高并发Web服务的多种场景。