2017-10-05 6 views
1

私はaws-sdkを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 
}); 

を使用した場合

以下のコードは再度、上記のコードは、スタンドアローンのファイルとして正常に動作し正常に動作します。データがFirehoseにプッシュされ、さらにRedshiftに移動します。私は

node program.js 

を実行した場合 は、私は赤方偏移に私のデータを見ることができています。わーい!!

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

はしかし、私が本当に達成したいことにデータをプッシュすることです特定のルートが私の明示的なアプリケーションでヒットすると、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が実行された分は...それは次のエラーで私のプログラムがクラッシュ

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ライブラリのバグですか、何か間違っていますか?

+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

FYIの場合、res.send(data)は効果的にプログラムを終了してデータを送信します。ただし、putRecordコールバックは、退出が発生する時刻です。ノードでは、コードの上から順にシーケンスが発生するのではなく、コールバックイベントの順に実行されます。ので、あなたのコードの実行の流れは次のようになります:

  1. ファイルが実行
  2. いくつかの操作が行われた操作のための
  3. コールバックはtheresの追加コードは外の動作場合
  4. は、その後、それが継続されます発生しています、それ以外の場合は、そのコールバックでコードが終了します。したがって、putRecordコールバックにres.sendを入れてください。
+0

res.send(data)のみでした。プログラムを終了しないでください。結局のところ、これは24時間365日稼働する高速サーバーです。 putRecordは非同期アクティビティなので、eventQueueにプッシュされ、このイベントが完了するたびにコールバックが実行されるはずです。 –

関連する問題