首页 > 解决方案 > 我想将来自 s3 对象的字符串发送到客户端

问题描述

我在将来自 s3 对象主体的字符串发送到客户端时遇到问题

我正在将 aws sdk 用于节点,并使用 apollo server(express)、express、react

我确实从 s3 获取了对象并创建了可读流。然后我听数据事件,所以我可能会向客户端发送字符串

let data = '';
s3.getObject(params).createReadStream().on('data', function(chunk) {
  data += chunk;
});

return { data }

我认为数据不是空字符串,但它是空字符串我该怎么做才能解决这个问题?

编辑:

let data = '';
function promiseBasedRequest (params) {
  return new Promise((resolve, reject) => {
    s3.getObject(params).createReadStream()
    .on('data', function (chunk) {
      data += chunk;
    })
    .on('end', function () {
      resolve(data);
    })
    .on('error', function (err) {
      reject(err);
    });
  });
} 

await promiseBasedRequest(params);

这按我的意图工作。

标签: javascriptnode.jsamazon-s3

解决方案


您不是在等待写入end. 首先,该函数需要是异步的 Promise 或回调。

function getData(params) {
    let data = ''
    return new Promise((res, rej) => {
        let data = '';
        s3.getObject(params).createReadStream()
        .on('data', function (chunk) {
            data += chunk;
        })
        .on('end', function(){
            res(data);
        })
        .on('error', function(){
            rej()
        })
    })
}

您可以通过以下方式使用该功能:

(async(){
    const data = await getData()
})();

或者getData().then(..)

编辑:另外,getObject也有一种promise方法。

s3.getObject(params).promise().then(...).catch(...)

推荐阅读