Node.js基于http模块搭建简易HTTP服务及参数处理

作者:夜航船

时间:2026-10-25

浏览:511

本文详解如何使用Node.js原生http模块搭建简易HTTP服务。内容涵盖服务器创建、监听端口、处理不同请求路径,以及解析查询字符串和JSON请求体。同时介绍了服务端设置Cookie与响应头,解决跨域带凭据请求的配置方法,适合初学者快速掌握基础网络编程。

文章目录

本文仅基于Node.js内置的http模块,演示如何构建一个基础的HTTP服务。

该服务主要涵盖以下核心功能:

  • 接收并响应客户端发起的请求。
  • 根据访问地址的不同,返回相应的内容信息。
  • 解析客户端传递的请求体(如JSON字符串)及查询字符串参数。
  • 实现服务端设置Cookie以及读取客户端发送的Cookie数据。

基础HTTP服务搭建

核心逻辑依赖于http模块提供的createServer方法创建服务实例,以及listen方法启动监听。具体实现代码如下:

const http = require('http');
// 初始化http服务
const server = http.createServer();

// 启动 HTTP 服务监听连接
server.listen(8000, () => {
    console.log('service run: http://127.0.0.1:8000');
});

// 侦听请求事件
server.on('request', (req, res) => {
    try {
        // 设置响应头允许跨域
	res.setHeader('Access-Control-Allow-Origin', '*');

        res.statusCode = 200;
        res.setHeader('Content-Type', 'text/plain');
        res.end('HTTP服务搭建成功');
    } catch (ex) {
	console.error(ex.message);
	res.statusCode = 500;
	res.end('service error');
    }
});

上述代码完成了基础HTTP服务的搭建,目前仅能返回固定文本,且未针对请求路径和参数进行差异化处理。接下来,我们将重点解决请求地址的识别与响应问题。

基于请求地址的差异化响应

每当客户端发起新请求,服务器会触发request事件。该事件的回调函数接收两个关键对象:request对象包含详细的请求信息,response对象用于构建返回给客户端的响应。我们可以通过request对象的url属性提取请求地址,实现代码如下:

const http = require('http');
const server = http.createServer();

server.listen(8000, () => {
    console.log('service run: http://127.0.0.1:8000');
});

server.on('request', (req, res) => {
    try {
        res.setHeader('Access-Control-Allow-Origin', '*');
        res.setHeader('Content-Type', 'application/json');

        // 获取请求地址
	const urls = req.url.split('?');
	const requestAddress = urls[0];
       console.log(`请求地址:${ requestAddress }`);

        const callback = {
          '/test': () => {
            res.statusCode = 200;
            res.end(JSON.stringify({text: '通过测试'}));
          },
          '/': () => {
            res.statusCode = 200;
            res.end(JSON.stringify({text: 'hello world'}));
          }
        }
		
        if (callback[requestAddress] instanceof Function) {
          return callback[requestAddress]()
        }

        res.writeHead(200, '响应成功');
        res.end('成功收到请求');
    } catch (ex) {
	console.error(ex.message);
	res.statusCode = 500;
	res.end('service error');
    }
});

上述代码实现了根据请求地址返回不同内容的功能,但尚未涉及请求体参数和查询字符串的解析。接下来,我们将补充获取请求参数的相关代码。

请求参数解析

查询字符串信息可从request对象的url属性中提取,而请求体参数则需要通过监听request对象的data事件来获取。具体实现如下:

const http = require('http');
const server = http.createServer();

server.listen(8000, () => {
    console.log('service run: http://127.0.0.1:8000');
});

server.on('request', (req, res) => {
    try {
        res.setHeader('Access-Control-Allow-Origin', '*');
        res.setHeader('Content-Type', 'application/json');

	const urls = req.url.split('?');
	const requestAddress = urls[0];
        console.log(`请求地址:${ requestAddress }`);

        const callback = {
          '/test': () => {
            console.log(`查询字符串:${urls[1]}`);

            if (req.method === 'POST') {
            // post请求,获取json格式的请求体参数
              let data = '';
              
              // req对象是一个流(参考Stream API),可以监听它的data事件来获取数据块。
              req.on('data', (chunk) => {
                // 这里假设收到的数据是字符串,隐式转换:二进制数据 => 字符串
                data += chunk;
              });
              
              // 在获取数据结束时,调用end事件
              req.on('end', () => {
                data = JSON.parse(data);
                console.log('请求体:', data);
              });
            }

        
            res.statusCode = 200;
            res.end(JSON.stringify({text: '通过测试'}));
          },
          '/': () => {
            console.log(`查询字符串:${urls[1]}`);
        
            res.statusCode = 200;
            res.end(JSON.stringify({text: 'hello world'}));
          }
        }
		
        if (callback[requestAddress] instanceof Function) {
          return callback[requestAddress]()
        }

        res.writeHead(200, '响应成功');
        res.end('成功收到请求');
    } catch (ex) {
	console.error(ex.message);
	res.statusCode = 500;
	res.end('service error');
    }
});

通过上述代码,我们成功实现了从请求体中解析JSON格式数据以及提取查询字符串参数的功能。

服务端Cookie设置与跨域处理

若服务器需支持跨域带凭据的请求,必须将响应头Access-Control-Allow-Credentials设置为true,且Access-Control-Allow-Origin不能为通配符'*',必须指定具体的域名。在前端,若要允许跨域发送凭据至服务器,需将XMLHttpRequest对象的withCredentials属性设置为true。

const http = require('http');
const server = http.createServer();

server.listen(8000, () => {
    console.log('service run: http://127.0.0.1:8000');
});

server.on('request', (req, res) => {
    try {
        // 跨域允许携带凭据(cookie之类)
        res.setHeader('Access-Control-Allow-Credentials', 'true');
        // 要允许跨域携带cookie,必须设置为具体的域,不能是‘*'
        res.setHeader('Access-Control-Allow-Origin', 'http://127.0.0.1:5500');
        res.setHeader('Content-Type', 'application/json');

        const requestAddress = req.url.split('?')[0];
    
        const callback = {
          '/login': () => {
            // 设置cookie
            res.setHeader('Set-Cookie', 'name=wst;age=24;Max-Age=666;');
            res.statusCode = 200;

            // 返回json格式数据到客户端
            res.end(JSON.stringify({text: '登录成功'}));
          },
          '/': () => {
            // 通过req.headers.cookie读取cookie
            console.log(req.headers.cookie)
            res.statusCode = 200;
            res.end(JSON.stringify({text: 'hello world'}));
          }
        }
		
        if (callback[requestAddress] instanceof Function) {
          return callback[requestAddress]()
        }

        res.writeHead(200, '响应成功');
        res.end('成功收到请求');
    } catch (ex) {
	console.error(ex.message);
	res.statusCode = 500;
	res.end('service error');
    }
});

至此,一个具备基础请求处理、参数解析及Cookie管理功能的HTTP服务已搭建完成。如需了解更多Node.js搭建HTTP服务的相关内容,可查阅本站往期文章或继续浏览后续教程,感谢大家的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章