首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >aws-sdk使nodejs程序崩溃

aws-sdk使nodejs程序崩溃
EN

Stack Overflow用户
提问于 2017-10-06 06:39:23
回答 2查看 111关注 0票数 1

我正在使用aws-sdk for javascript。

在独立程序中使用时,下面的代码运行良好

代码语言: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
});

同样,上面的代码可以作为一个独立的文件正常工作。数据被推入消防水带,然后被进一步推送到Redshift。所以如果我执行

代码语言:javascript
复制
node program.js

我可以在Redshift中看到我的数据。耶!!

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

然而,我真正想实现的是,当我的express应用程序中的某个路由被击中时,将数据推送到firehose。因此,我采用与上面完全相同的代码,并将其放入我的路径中

代码语言:javascript
复制
// 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的那一分钟..它使我的程序崩溃,并显示以下错误:

代码语言:javascript
复制
```javascript

TypeError: doneCallback.cal不是函数

代码语言:javascript
复制
at Request.callListeners (/api-project/node_modules/aws-sdk/lib/sequential_executor.js:115:18)
代码语言:javascript
复制
at callNextListener (/api-project/node_modules/aws-sdk/lib/sequential_executor.js:95:12)
代码语言:javascript
复制
at /api-project/node_modules/aws-sdk/lib/event_listeners.js:74:9
代码语言:javascript
复制
at finish (/api-project/node_modules/aws-sdk/lib/config.js:315:7)
代码语言:javascript
复制
at /api-project/node_modules/aws-sdk/lib/config.js:333:9
代码语言:javascript
复制
at Credentials.get (/api-project/node_modules/aws-sdk/lib/credentials.js:126:7)
代码语言:javascript
复制
at getAsyncCredentials (/api-project/node_modules/aws-sdk/lib/config.js:327:24)
代码语言:javascript
复制
at Config.getCredentials (/api-project/node_modules/aws-sdk/lib/config.js:347:9)
代码语言:javascript
复制
at Request.VALIDATE_CREDENTIALS (/api-project/node_modules/aws-sdk/lib/event_listeners.js:69:26)
代码语言:javascript
复制
at Request.callListeners (/api-project/node_modules/aws-sdk/lib/sequential_executor.js:101:18)
代码语言:javascript
复制

我不明白为什么这段代码会使我的express程序崩溃。这是aws-sdk库中的错误还是我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2017-10-06 08:03:53

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

代码语言:javascript
复制
firehose.putRecord(params, function (err, data) {
   if (err) {
     console.log(err);
     return;
   }
    console.log(data);           
    res.send("some data");
  }
);
票数 1
EN

Stack Overflow用户

发布于 2017-10-06 08:15:47

仅供参考,您的res.send(data)将有效地退出程序并发送数据。但是,您的putRecord回调是您应该退出的时间。在node中,事情不是按照代码从上到下的顺序发生的,而是按照回调事件的顺序执行的。因此,代码的执行流程将如下所示:

  1. file is performed
  2. callback
  3. 如果操作之外有额外的代码,它将继续,否则代码将在该回调中退出。因此,将res.send放在putRecord回调中。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46595822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档