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

在Express中获取S3存储桶JSON文件时遇[object Object]问题求助

解决Express中使用@aws-sdk/client-s3获取S3 JSON文件返回[object Object]的问题

问题核心原因

  1. 你的代码仅在服务端控制台打印解析后的JSON对象,但未向客户端返回任何响应数据,若客户端尝试将响应对象直接转为字符串,就会出现[object Object]。
  2. getObject参数中的ContentType无效,该字段仅用于上传对象时设置,获取对象无需指定。
  3. 回调式的getObject无法被外层try/catch捕获错误,错误仅在控制台打印,不会反馈给客户端。

修正后的代码

const express = require('express');
const { S3 } = require('@aws-sdk/client-s3');

const app = express();
const port = 3100;

const s3 = new S3({ region: 'us-west-2' });

app.get('/s3/sample', async (req, res) => {
  try {
    const params = {
      Bucket: `bucket`, // 替换为你的实际存储桶名称
      Key: `category/file.json`,
    };

    // 使用async/await替代回调写法,更符合async函数逻辑
    const data = await s3.getObject(params);
    const json = JSON.parse(data.Body.toString('utf-8'));
    
    // 向客户端返回解析后的JSON数据,Express自动处理Content-Type
    res.json(json);
    console.log('解析后的JSON:', json);
  } catch (error) {
    console.error('请求S3或解析JSON出错:', error);
    // 向客户端返回错误响应,便于调试
    res.status(500).json({
      error: '获取S3文件失败',
      details: error.message
    });
  }
});

// 启动服务器(原代码遗漏了这一步)
app.listen(port, () => {
  console.log(`服务器运行在http://localhost:${port}`);
});

关键优化点

  • 改用async/await调用:@aws-sdk/client-s3的方法默认返回Promise,配合async/await写法更简洁,且错误能被外层try/catch统一捕获。
  • 移除无效参数:删除getObject中的ContentType,该参数仅在putObject等上传操作时生效。
  • 正确返回响应:使用res.json(json)向客户端返回序列化后的JSON字符串,Express自动设置Content-Type: application/json,避免出现[object Object]。
  • 完善错误反馈:将错误信息返回给客户端,同时在服务端记录详细日志,便于排查问题。

额外排查提示

如果是在服务端控制台看到[object Object],检查是否用了类似console.log('JSON:' + json)的写法——这种字符串拼接会将对象转为[object Object],改用console.log('JSON:', json)(逗号分隔,控制台可展开对象)或console.log(JSON.stringify(json, null, 2))(打印格式化JSON字符串)即可。

内容的提问来源于stack exchange,提问作者KD.S.T.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:35:28