【问题标题】:access node.js hashmap after it's finished populating // AWS lambda完成填充后访问 node.js hashmap // AWS lambda
【发布时间】:2021-01-11 02:38:34
【问题描述】:

所以我正在 AWS 中开发一个 lambda,而 node.js 对我来说也是新的。我相当确定这与 nodejs 是异步的有关,并且可以通过 promise / async / await 解决,但没有解决方案可以帮助我。我已经尝试了很多例子,但我无法根据我所拥有的进行调整。我已经将我的代码超级简化为以下内容:

var fs = require('fs');
var es = require('event-stream');
let m = new Map();
const aws = require("aws-sdk");
let params = {...}; //details omitted, but refers to a csv file
let s3 = new aws.S3();

module.exports.handler = (event, context, callback) => {
   s3.getObject(params).createReadStream().pipe(es.split()).on('data'), (row) => {
       let dat = row.toString().split(',').map(function(x) {return x.trim() });
       m.set(dat[0], dat[1]); // there's actually around 100 lines of logic that I'm simplifying
   });
console.log(m.size);

我明白为什么我总是会得到 0 号,但我找不到解决方法。地图填充完成后的目标是遍历它并将所有元素推送到 dynamoDB。 (我不直接这样做,因为有很多更新并且需要大量 docClient.get / .query / .put)我只需要完成填充地图(换句话说,流已经完成)。我有点担心我已经简化了太多,部分答案将涉及对我省略的逻辑做出额外的承诺,但我将从这里开始,因为测试这段代码也会产生大小 0。

我们将不胜感激,谢谢!

【问题讨论】:

    标签: node.js amazon-web-services asynchronous amazon-s3 promise


    【解决方案1】:

    是的,问题是异步性。简化的代码结构:

    // 1
    s3.getObject(params).createReadStream().pipe(es.split()).on('data'), (row) => {
      ...
      // 3
    });
    // 2
    console.log(m.size);
    

    执行遵循 1-2-3,因此 console.log 发生在任何数据到达之前。您可以监听关闭事件并在那里打印结果:

    s3.getObject(params).createReadStream().pipe(es.split()).on('data'), (row) => {
      ...
    }).on('close', () => {
      console.log(m.size);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-19
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多