async/await fetch与https模块分片请求的差异及选型建议
https.request 与 async/await fetch 的核心区别及选型建议
先看你提供的基于 https.request 的实现:
var options = { 'method': 'POST', 'hostname': 'xxxx', 'path': '/sms/2/text/advanced', 'headers': { 'Authorization': 'App xxx', 'Content-Type': 'application/json', 'Accept': 'application/json' }, 'maxRedirects': 20 }; var req = https.request(options, function (res) { var chunks = []; res.on("data", function (chunk) { chunks.push(chunk); }); res.on("end", function (chunk) { var body = Buffer.concat(chunks); console.log(body.toString()); }); res.on("error", function (error) { console.error(error); }); }); var postData = JSON.stringify({ "messages": [ { "destinations": [{"to":"xxxxx211"}], "from": "ServiceSMS", "text": "Congratulations on sending your first message.\nGo ahead and check the delivery report in the next step." } ] }); req.write(postData); req.end();
对应的 async/await fetch 实现示例:
async function sendSMS() { try { const response = await fetch('https://xxxx/sms/2/text/advanced', { method: 'POST', headers: { 'Authorization': 'App xxx', 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify({ "messages": [ { "destinations": [{"to":"xxxxx211"}], "from": "ServiceSMS", "text": "Congratulations on sending your first message.\nGo ahead and check the delivery report in the next step." } ] }) }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const result = await response.json(); console.log(result); } catch (error) { console.error(error); } } sendSMS();
主要区别
1. 语法与可读性
https.request基于Node.js事件回调模式,需手动监听data/end/error事件、拼接响应Buffer,代码嵌套分散,逻辑连贯性差,维护成本高。fetch结合async/await采用同步风格异步写法,代码线性连贯,逻辑一目了然,可读性和可维护性显著优于前者。
2. 功能封装程度
https.request是Node.js核心底层API,几乎所有细节都需手动处理:比如响应体拼接、请求数据写入与结束、重定向配置等。fetch是高层封装的标准API,内置支持响应体解析(res.json()/res.text())、自动处理重定向、Promise集成,无需手动操作底层流。
3. 错误处理逻辑
https.request需单独监听error事件捕获网络错误,但HTTP非2xx状态码(如400/500)不会触发error,需手动判断res.statusCode处理业务错误,逻辑分散。fetch的Promise仅在网络层面出错时reject,HTTP错误需通过response.ok或response.status手动判断,但结合try/catch可集中处理所有异常,逻辑更统一。
4. 环境兼容性
https.request是Node.js核心模块,全版本支持,无需额外依赖。fetch是Web标准API,Node.js v18及以上版本内置支持,v18以下需安装node-fetch第三方包。
选型建议
- 优先选fetch + async/await:若项目基于Node.js v18+,该方案代码简洁、维护成本低,符合现代JS开发习惯,团队协作时易统一代码风格。
- 选https.request的场景:需兼容低版本Node.js,或需要对请求/响应做极致底层控制(如自定义流处理、特殊重定向逻辑)时,底层API的灵活性更具优势。
- 简单API调用场景:fetch的高层封装能避免手动拼接Buffer这类易出错的重复代码,大幅提升开发效率。
内容的提问来源于stack exchange,提问作者Rick James
相关产品推荐
相关产品推荐

