2017-10-05 44 views
1

我正在使用aws-sdk for javascript。下面aws-sdk崩溃nodejs程序

该代码在一个独立的程序

//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 

我能看到我的红移数据。好极了!!

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

但是,我真正想实现的是将数据推到当我的快速应用程序中某条路线受到撞击时流水。所以,我采取完全相同的代码如上,贴在我的路线

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

+0

终于明白了这个问题。 aws-sdk没有正确安装(我不知道这是怎么发生的)。在第115行的文件sequential_executor.js中有一个语句** doneCallback.call ** ...但是在我的文件中,该语句只是** doneCallback.cal ** .. –

回答

1

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

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

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

  1. 文件执行
  2. 执行一些操作
  3. 回调操作时
  4. 那么如果那里有额外的代码以外的工作,它将继续,否则代码将在该回调中退出。因此,将res.send放入您的putRecord回调中。
+0

res.send(data)should不退出程序。毕竟这是一个全天候运行的快递服务器。由于putRecord是一个异步活动,我相信它会被推到eventQueue上,并且回调应该在这个事件完成时执行。 –