2017-10-05 45 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上,並且回調應該在這個事件完成時執行。 –