2017-10-05 1 views
1

J'utilise aws-sdk pour javascript.aws-sdk crashing nodejs programme

Le code ci-dessous fonctionne bien lors de l'utilisation dans un programme autonome

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

Encore une fois, le code ci-dessus fonctionne très bien en tant que fichier autonome. Les données sont poussées dans les tuyaux d'incendie, puis plus loin vers Redshift. donc si j'execute

node program.js 

Je suis capable de voir mes données Redshift. Yay!!

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

Cependant, ce que je veux vraiment atteindre est de pousser les données à firehose quand un certain itinéraire est frappé dans mon application express. Je prends donc exactement le même code que ci-dessus et le coller dans ma route

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

    }); 

La minute firehose.putRecord est exécuté .. il se bloque mon programme avec l'erreur suivante:

`` `

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) 

Je ne comprends pas pourquoi ce code bloque mon programme express. est-ce un bug dans la bibliothèque aws-sdk ou est-ce que je fais quelque chose de mal?

+0

Enfin compris le problème. aws-sdk n'avait pas été installé correctement (je me demande comment cela pourrait arriver). dans le fichier sequential_executor.js sur la ligne 115 .. il y a une déclaration ** doneCallback.call ** ... cependant dans mon dossier cette déclaration était seulement ** doneCallback.cal ** .. –

Répondre

1

Vous devriez envoyer la réponse express dans votre rappel de succès.

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

Pour votre information, votre res.send(data) quittera efficacement le programme et envoyer des données. Toutefois, votre rappel putRecord est l'heure à laquelle votre sortie doit se produire. Dans un nœud, les choses ne se produisent pas dans une séquence du début à la fin du code, mais à la place elles s'exécutent dans l'ordre des événements de rappel. de sorte que le flux d'exécution pour votre code serait comme ceci:

    fichier
  1. exécute
  2. une opération est effectuée
  3. rappel pour l'opération se produit
  4. alors s'il y a un code supplémentaire à l'extérieur de fonctionner, il continuera, sinon le code sortira dans ce rappel. Par conséquent, placez le res.send dans votre rappel putRecord.
+0

res.send (data) devrait pas quitter le programme. Après tout, c'est un serveur express fonctionnant 24/7. Étant donné que putRecord est une activité asynchrone, je crois qu'il est poussé sur le eventQueue et le callback devrait être exécuté à chaque fois que cet événement se termine. –