小编Jul*_*ian的帖子

Lambda并不总是收到AWS S3通知'ObjectCreated'

我想要实现的目标:我通过AWS SES接收电子邮件并将其存储到AWS S3.然后,电子邮件由AWS Lambda函数解析,结果存储到数据库.在创建新对象时,S3会调用Lambda.

问题:我的数据库中只有一小部分(我会说少于10%)的电子邮件.


在S3上,我设置了一个Event Notification.它正在调用我的Lambda函数ObjectCreated (All).根据我的理解,这意味着,对于在S3上创建的每个新对象(即SES存储的电子邮件),都会调用Lambda函数.

Lambda函数做了几件事,但至少它在这里做了:

exports.handler = function(event, context) {
  Async.mapSeries(event.Records,
    function dealWithOneMail(record, callback) {

    var srcKey = decodeURIComponent(record.s3.object.key.replace(/\+/g, " "));
    console.log('> Working on object ' + srcKey);
  }
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我重复阵列上Recordsevent至少打印对象的名称一次.我也在我的Lambda代码的第一行中执行此操作:

console.log('> Lambda function invoked!');
Run Code Online (Sandbox Code Playgroud)

从我的日志来看,Lambda函数不是每次调用,而只是有时调用.为什么我这么想?

我今天下载了所有新的电子邮件,这些是1,245个对象.所有这些电子邮件也存储在S3上.但我只Lambda function invoked在我的CloudWatch日志中找到了85次自动为Lambda设置的日志.


有没有人提示可能是错误甚至是我可以调试的想法?

amazon-s3 amazon-web-services amazon-sns aws-lambda

6
推荐指数
1
解决办法
784
查看次数

Node.js 中的有条件管道流

我想以一种很好的方式有条件地管道流。我想要实现的行为如下:

if (someBoolean) {

  stream = fs
    .createReadStream(filepath)
    .pipe(decodeStream(someOptions))
    .pipe(writeStream);

} else {

  stream = fs
    .createReadStream(filepath)
    .pipe(writeStream);

}
Run Code Online (Sandbox Code Playgroud)

所以我准备了我所有的流,如果someBoolean是真的,我想向管道添加一个额外的流。

然后我以为我找到了detour-stream的解决方案,但不幸的是没有设法设置它。我使用了类似于gulp-if 的符号,因为这被提到作为灵感:

var detour = require('detour-stream');

stream = fs
  .createReadStream(filepath)
  .detour(someBoolean, decodeStream(someOptions))
  .pipe(writeStream);
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这只会导致错误:

  .detour(someBoolean, decodeStream(someOptions))
 ^
TypeError: undefined is not a function
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

stream node.js

5
推荐指数
1
解决办法
2298
查看次数

通过java.util.Calendar.add()添加一周失败

我试图在两个日期之间的所有几周内迭代我的Java程序(结束日期是今天).首先,我得到开始日期:

Calendar start = Calendar.getInstance();
start = data.getFirstDate(users, threads);
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.开始日期是正确的,我可以使用它.现在我迭代:

Calendar current = start;
while(current.before(Calendar.getInstance()) {
    // Do something
    current.add(Calendar.DATE, 7);
}
Run Code Online (Sandbox Code Playgroud)

好吧,这种作品.我从2002/8/23开始,然后是2002/8/30,然后是2002/9/7 ...... UNTIL 2002/11/30.之后的日期是2003/0/6,既不正确也不是有效日期!

我究竟做错了什么?我试过current.add(Calendar.DATE, 7),current.add(Calendar.WEEK_OF_YEAR, 1),current.add(Calendar.DAY_OF_YEAR, 7)和其他两种方式.使用current.roll(Calendar.DATE, 7)不起作用,因为我留在同一个月.使用GregorianCalendar也没有效果.

任何建议将不胜感激!

谢谢朱利安

java calendar date dayofweek

4
推荐指数
1
解决办法
4127
查看次数

等待最后一个stream.on('data')事件中的异步函数回调

我正在使用fast-csv使用a来迭代CSV文件stream.对于CSV文件的每一行,我想在redis中创建一个作业,我使用kue.解析一行是同步函数.整件事看起来像这样:

var csvStream = fastCsv(_config.csvOptions)
  .on('data', function(data) {
    var stream = this;
    stream.pause();

    var payload = parseRow(data, _config);
    console.log(payload); // the payload is always printed to the console

    var job = kue.create('csv-row', {
        payload: payload
      })
      .save(function(err) {
        if (!err) console.log('Enqueued at ' + job.id);
        else console.log('Redis error ' + JSON.stringify(err));

        stream.resume();
      });
  })
  .on('end', function() {
    callback(); // this ends my parsing
  });
Run Code Online (Sandbox Code Playgroud)

console.log(payload);我的CSV文件的每一行都有简单的显示,但是没有创建作业.即,回调中的输出save都没有被打印,并且作业不在我的redis中.

我假设,因为它是CSV文件的最后一行,流已经发出end,所以kue.create()在进程终止之前无法执行最后一行?

有没有办法停止流, …

stream redis node.js

3
推荐指数
1
解决办法
2413
查看次数