NodeJS中Request模块如何保存响应Body?异步赋值问题求助
解决Request模块异步赋值问题
嘿,这问题我太熟了——刚接触Node.js异步操作的朋友几乎都会踩这个坑!
问题根源
你的代码里,request是异步函数,它发送HTTP请求的时候,Node.js不会等着它完成,而是直接往下执行console.log('test', test)。这时候请求还没拿到响应,test自然还是初始值"nothing!"。等请求完成、回调函数执行的时候,那个console.log早就跑完了,所以你看不到更新后的test。
解决方案
我们需要把依赖异步结果的代码,放到异步操作完成的地方,或者用更现代的方式处理异步逻辑:
方案1:把逻辑放进回调函数里
最简单的办法就是,把需要使用test的代码直接写在request的回调函数内部,确保它在请求完成后执行:
logged: function () { var request = require('request'); let test = "nothing!"; request('http://localhost:8080/log', function (error, response, body){ console.log('error:', error); console.log('statusCode:', response && response.statusCode); console.log('body:', body); test = body; // 在这里使用更新后的test console.log('test', test); // 现在会输出"test: hi" }); }
方案2:用Promise + async/await(更优雅的现代写法)
request模块本身是基于回调的,你可以改用它的Promise版本request-promise,配合async/await让代码看起来像同步逻辑:
- 先安装依赖:
npm install request-promise
- 修改代码:
logged: async function () { const request = require('request-promise'); let test = "nothing!"; try { // await会等待请求完成,拿到响应body const body = await request('http://localhost:8080/log'); console.log('body:', body); test = body; console.log('test', test); // 这里也会正确输出"test: hi" } catch (error) { // 捕获请求失败的错误 console.log('error:', error); } }
补充说明
Node.js是单线程异步非阻塞模型,所有I/O操作(比如HTTP请求、文件读写)都会在后台处理,主线程继续执行同步代码。所以处理异步结果的时候,一定要确保逻辑在异步操作完成后才执行——要么用回调,要么用Promise/async-await,这是Node.js开发的核心要点之一哦!
内容的提问来源于stack exchange,提问作者Felipe
相关产品推荐
相关产品推荐

