当前位置:主页 > 脚本语言 > NodeJS >

使用nodejs搭建一个简易HTTP服务的实现示例

时间:2022-07-14 08:17:43 | 栏目:NodeJS | 点击:

本文只使用nodejs的http模块搭建一个简单的http服务。

主要实现功能:

先搭建一个简单的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事件的回调函数可以接受两个对象:一个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和读取客户端发送的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');
    }
});

您可能感兴趣的文章:

相关文章