You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:06:02