Node.js如何发送http请求,及Node.js中如何处理、获取文件路径
针对往期单元测试与logger日志系统的编写中,并发请求测试与日志目录创建、删除等功能,所使用到的http模块与path模块进行一下梳理
经过往期文章说明Node.js 模块系统学习,对Node.js的模块系统已经了解了,接下来会对Node.js的核心模块进行分批次的学习阐述
http模块包含客户端和服务器,可以通过node:http进行引入使用,本章分接收http接口请求与发送http请求两方面进行学习
使用http模块创建一个web服务器后,即可接收由客户端发送过来的接口请求(http://localhost:3000/)并返回响应(hello word !)
如需区分接口地址与参数的传递,可通过解析req参数实现
当然这些并不能满足一个项目的基本开发需求,所以配合koa/express框架,省掉了你对http模块二次封装的造轮子工作,配合框架的route功能就会很方便
以下为http模块如何接收接口请求并返回响应的示例,主要通过监听服务端口,然后触发响应的操作,一切接口地址与参数的操作都通过req这个参数值进行区分
const http = require('http');const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('hello word !');});server.listen(3000, () => {console.log('服务器运行在 http://localhost:3000/');});发送http请求方式较多,如:使用原生http模块发送、使用内置的fetch 全局对象发送、使用外部插件Axios发送
由于本次学习方向为nodejs服务端开发,所以我选择fetch的请求方式,与axios的前端调用方式区分开,http模块的发送太啰嗦,直接舍弃
下面对几种发送方式分别说明,并提供示例代码
原生http模块发送可使用两种方式,一个是http.request,一个是http.get
下方展示官方的示例代码:
import http from'node:http';import { Buffer } from'node:buffer';// 理解为请求参数const postData = JSON.stringify({'msg': 'Hello World!',});// 理解为请求配置const options = {hostname: 'www.google.com',port: 80,path: '/upload',method: 'POST',headers: {'Content-Type': 'application/json','Content-Length': Buffer.byteLength(postData), },};// 理解为初始化请求实例配置const req = http.request(options, (res) => {console.log(`STATUS: ${res.statusCode}`);console.log(`HEADERS: ${JSON.stringify(res.headers)}`); res.setEncoding('utf8'); res.on('data', (chunk) => {console.log(`BODY: ${chunk}`); }); res.on('end', () => {console.log('No more data in response.'); });});// 请求实例异常回调函数调用req.on('error', (e) => {console.error(`problem with request: ${e.message}`);});// 请求实例发送回调函数调用,请求发送-携带请求参数req.write(postData);// 请求实例结束回调函数调用req.end();Node.js 18+ 原生内置的方式,基于 Promise,不管你是前端还是nodejs后端,都可以用,因为他是基于nodejs内置的全局对象
const postData = { 'msg': 'Hello World!' };const url = 'http://www.google.com/upload';async function sendFetch() {try {const response = awaitfetch(url, {method: 'POST',headers: {'Content-Type': 'application/json', },body: JSON.stringify(postData), }); } catch (e) {console.error(`fetch请求异常:${e.message}`); }}sendFetch();我认为axios的主要应用方向仍然是前端使用,后端的话fetch足够了不用增加依赖,如果node在v12.x - v18之间的版本,可以考虑使用axios
总不能使用http模块发送请求吧,那太难受了
import axios from'axios';const postData = { 'msg': 'Hello World!' };const url = 'http://www.google.com/upload';async function sendFetch() {try {const response = await axios.post(url, postData); } catch (e) {console.error(`axios请求异常:${e.message}`); }}sendFetch();path模块主要用于处理文件和目录路径的工具
此配合方式,在编写logger日志系统,与编写单元测试中,使用此方式,用来获取日志磁盘存储路径与日志文件内容写入
两个模块配合,可以在ECMScript 模块系统中,获取当前文件的绝对路径与相对路径
import { fileURLToPath } from'node:url';import { dirname } from'node:path';// 1. 获取当前文件的绝对路径 (相当于 __filename)const __filename = fileURLToPath(import.meta.url);// 2. 获取当前文件所在目录的绝对路径 (相当于 __dirname)const __dirname = dirname(__filename);console.log(__filename);console.log(__dirname);http请求模块https://node.org.cn/docs/latest/api/http.html
fetch全局对象https://node.org.cn/docs/latest/api/globals.html#fetch
axios请求插件https://axios.rest/zh
path路径模块https://node.org.cn/docs/latest/api/path.html
url模块https://node.org.cn/docs/latest/api/url.html
ECMScript 模块系统-元数据https://node.org.cn/docs/latest/api/esm.html#importmeta
使用path模块与url模块配合获取文件路径、处理文件路径还挺不错的,http模块主要作用围绕着web服务、http通信