aws-sdk崩溃的nodejs程序

时间:2017-10-05 22:39:23

标签: node.js express aws-sdk

我正在使用aws-sdk for javascript。

在独立程序中使用时,以下代码可以正常工作

//program.js

const AWS = require('aws-sdk');
const firehose = new AWS.Firehose({
   accessKeyId: "XXX",
  secretAccessKey: "YY"
});

const params = {
  DeliveryStreamName: 'demo1',
  Record: {
    Data: new Buffer("Hello World")
  }
};

firehose.putRecord(params, function (err, data){
  if (err) {
    console.log(err);
    return;
  }
  console.log(data);           // successful response
});

同样,上面的代码可以作为独立文件使用。数据被推入firehose,然后进一步下降到Redshift。 所以,如果我执行

node program.js

我能够在Redshift中看到我的数据。耶!!

=============================

但是,我真正想要实现的是在我的快速应用程序中某个路线被击中时将数据推送到firehose。所以我采用与上面完全相同的代码并将其粘贴在我的路线中

// router.js
const AWS = require('aws-sdk');
const firehose = new AWS.Firehose({
   accessKeyId: "XXX",
  secretAccessKey: "YY"
});

router
  .get('/v1/locations/:id?', (req, res) => {

   const params = {
     DeliveryStreamName: 'demo1',
     Record: {
        Data: new Buffer("Hello World")
     }
   };

    firehose.putRecord(params, function (err, data){
     if (err) {
       console.log(err);
       return;
     }
      console.log(data);           

    });

   // do the work that needs to be done for this route and send a response
   res.send("some data");  

  });

分钟firehose.putRecord被执行..它崩溃了我的程序,出现以下错误:

```

TypeError: doneCallback.cal is not a function
    at Request.callListeners (/api-project/node_modules/aws-sdk/lib/sequential_executor.js:115:18)
    at callNextListener (/api-project/node_modules/aws-sdk/lib/sequential_executor.js:95:12)
    at /api-project/node_modules/aws-sdk/lib/event_listeners.js:74:9
    at finish (/api-project/node_modules/aws-sdk/lib/config.js:315:7)
    at /api-project/node_modules/aws-sdk/lib/config.js:333:9
    at Credentials.get (/api-project/node_modules/aws-sdk/lib/credentials.js:126:7)
    at getAsyncCredentials (/api-project/node_modules/aws-sdk/lib/config.js:327:24)
    at Config.getCredentials (/api-project/node_modules/aws-sdk/lib/config.js:347:9)
    at Request.VALIDATE_CREDENTIALS (/api-project/node_modules/aws-sdk/lib/event_listeners.js:69:26)
    at Request.callListeners (/api-project/node_modules/aws-sdk/lib/sequential_executor.js:101:18)

我无法理解为什么这段代码会崩溃我的快递程序。这是aws-sdk库中的错误还是我做错了什么?

2 个答案:

答案 0 :(得分:1)

您应该在成功回调中发送快速回复。

firehose.putRecord(params, function (err, data) {
   if (err) {
     console.log(err);
     return;
   }
    console.log(data);           
    res.send("some data");
  }
);

答案 1 :(得分:0)

仅供参考,您的res.send(data)将有效退出该计划并发送数据。但是,您的putRecord回调是您退出的时间。在节点中,事物不会从代码的顶部到底部按顺序发生,而是按照回调事件的顺序执行。所以代码的执行流程如下:

  1. 文件执行
  2. 执行某些操作
  3. 发生
  4. 操作回调
  5. 然后如果除了操作之外的附加代码,它将继续,否则代码将在该回调中退出。因此,请将res.send放入putRecord回调。