aws-sdk崩溃的nodejs程序

我使用javascript的aws-sdk。

下面的代码在独立程序中使用时工作正常

//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 }); 

上面的代码再次作为一个独立的文件工作正常。 数据被推入stream水,然后进一步到红移。 所以如果我执行

 node program.js 

我能够在Redshift中看到我的数据。 好极了!!

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

但是,我真正想要实现的是在特定的应用程序中某条路线被击中时将数据推送出去。 所以我采取与上述完全相同的代码,并坚持在我的路线

 // 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库中的错误还是我做错了什么?

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

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

仅供参考,您的res.send(data)将有效地退出程序并发送数据。 但是,您的putRecordcallback是您退出应该发生的时间。 在节点中,事情不是从代码的顶部到底部的顺序发生,而是按照callback事件的顺序执行。 所以你的代码的执行stream程是这样的:

  1. 文件执行
  2. 一些操作被执行
  3. 发生操作callback
  4. 那么如果额外的代码运行,它将继续,否则代码将在该callback中退出。 因此,把res.send放在你的putRecordcallback中。