Node.js异步请求中对象打印正常但访问属性返回undefined是什么原因?
问题根因
http.get是Node.js原生回调风格的API,不返回Promise对象,对其使用await没有任何等待效果,代码会直接跳过请求逻辑,在请求还没完成、end事件未触发时就执行后续的console.log(m)和return语句。- 你观察到
console.log(m)能显示正确的w、h属性,是控制台打印引用类型的特性导致的:控制台输出的对象保存的是内存引用,当你手动点开查看对象属性时,请求已经完成、Object.assign(m, data)已经执行,所以能看到完整属性;但同步执行console.log(m.w)时,请求尚未结束,m还没有被赋值对应属性,自然返回undefined。
修复方案
把http.get包装成Promise后再用await等待,确保请求执行完成、属性赋值结束后再走后续逻辑,修改后的代码如下:
var http = require('http'); var sizeOf = require('image-size'); async function asynchronousProcess(options){ let m = {} // 把http.get包装为Promise await new Promise((resolve, reject) => { http.get(options, function (response) { var chunks = []; response.on('data', function (chunk) { chunks.push(chunk); }).on('end', function() { var buffer = Buffer.concat(chunks); var data = {w: sizeOf(buffer).width, h: sizeOf(buffer).height} Object.assign(m, data) resolve() // 请求完成后resolve,结束await等待 }).on('error', reject) // 监听响应错误,异常时抛出 }).on('error', reject) // 监听请求错误,异常时抛出 }) console.log(m) console.log(m.w) // 此处可正常拿到对应值 return m }
内容的提问来源于stack exchange,提问作者Dmitriy Karpovich
相关产品推荐
相关产品推荐

