我正在使用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
});同样,上面的代码可以作为一个独立的文件正常工作。数据被推入消防水带,然后被进一步推送到Redshift。所以如果我执行
node program.js我可以在Redshift中看到我的数据。耶!!
=============================
然而,我真正想实现的是,当我的express应用程序中的某个路由被击中时,将数据推送到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的那一分钟..它使我的程序崩溃,并显示以下错误:
```javascriptTypeError: doneCallback.cal不是函数
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:9at finish (/api-project/node_modules/aws-sdk/lib/config.js:315:7)at /api-project/node_modules/aws-sdk/lib/config.js:333:9at 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)我不明白为什么这段代码会使我的express程序崩溃。这是aws-sdk库中的错误还是我做错了什么?
发布于 2017-10-06 08:03:53
您应该在成功回调中发送快速响应。
firehose.putRecord(params, function (err, data) {
if (err) {
console.log(err);
return;
}
console.log(data);
res.send("some data");
}
);发布于 2017-10-06 08:15:47
仅供参考,您的res.send(data)将有效地退出程序并发送数据。但是,您的putRecord回调是您应该退出的时间。在node中,事情不是按照代码从上到下的顺序发生的,而是按照回调事件的顺序执行的。因此,代码的执行流程将如下所示:
res.send放在putRecord回调中。https://stackoverflow.com/questions/46595822
复制相似问题