2017-08-31 2 views
0

Je continue d'obtenir une erreur de GCP à ce sujet, j'utilise le datastore & déploiement sur GAE. Quelqu'un at-il des idées pourquoi je reçois cette erreur en utilisant les promesses javascript?Non promis rejet de la promesse - chemin clé incomplet

J'utilise une action google pour ouvrir sur google home, demander une phrase clé d'activation si l'appareil n'a pas déjà été enregistré dans un numéro d'appartement dans le magasin de données. S'il n'est pas enregistré, il demande une phrase clé qui associera l'identifiant unique de l'appareil à un numéro d'appartement. Si l'identifiant unique a un appartement associé, alors il demande ce qu'il peut aider.

Je ne sais pas pourquoi il est dit que le chemin de la clé est incomplet. Aussi je suis nouveau aux promesses! Ainsi, toute aide est grandement appréciée

UnhandledPromiseRejectionWarning: Unhandled rejet de la promesse (id de rejet: 99): Erreur: élément de chemin clé ne doit pas être incomplète: [Activation:]

Avec ce code?

datastore.get(datastore.key([ACTIVATION, device_id])) 
.then(results => { 
    let activation = null 
    if (results[0]) { 
     activation = results[0] 
    } 
    return Promise.resolve(activation) 
}) 
.then(activation => { 
    console.log(activation) 

    let actionMap = new Map(); 

    actionMap.set('input.welcome', assistant => { 
     console.log('input.welcome') 
     if (!activation) { 
      assistant.ask("Hello! May I have your key phrase?") 
     } 
     else {assistant.ask("Welcome back, what can I do for you today?") 
     } 
    }) 

    actionMap.set('input.unknown', assistant => { 
     console.log('input.unknown') 
     if (!activation) { 
      assistant.ask("Please provide your activation code") 
     } else 
     { 
      let speech = "OK" 
      if (request.body && 
       request.body.result && 
       request.body.result.fulfillment && 
       request.body.result.fulfillment.messages && 
       request.body.result.fulfillment.messages[0] && 
       request.body.result.fulfillment.messages[0].speech) { 
        speech = request.body.result.fulfillment.messages[0].speech 
       } 
      sendSMSFromUnit(activation.number, request.body.result.resolvedQuery) 

      assistant.tell("Got it. ") 
     } 
}) 

    actionMap.set('input.keyphrase', assistant => { 
     let activationCode = TitleCase([ 
      assistant.getArgument('Token1'), 
      assistant.getArgument('Token2'), 
      assistant.getArgument('Token3') 
     ].join(" ")) 
     console.log('activationCode: ' + activationCode) 
     if (activation && activation.keyphrase == activationCode) { 
      assistant.tell('This device is activated.') 
      return 
     } 

     datastore.get(datastore.key([APARTMENT, activationCode])) 
     .then(results => { 
      console.log(results) 
      if (!results[0]) { 
       assistant.ask('Activation unsuccessful. Can you provide your activation code again?') 
       return 
      } 
      let apartment = results[0] 

      datastore.insert({ 
       key: datastore.key([ACTIVATION, device_id]), 
       data: { 
        name: apartment.name, 
        number: apartment.number, 
        keyphrase: activationCode, 
        device_id: device_id 
       } 
      }).then(() => { 
       assistant.ask('Thanks! ') 
      }) 
     }) 
    }) 

Répondre

1

Tout le modèle d'une promesse est

Promise((resolve, reject) => { 
    // ... 
}); 

Maintenant, comment l'utiliser

promiseFunc(...) 
    .then((x) => { 
    // It get executed well 
    }) 
    .catch((x) => { 
    // An error happened 
    }); 

Dans votre code vous manque la partie .catch. Donc, si une erreur est renvoyée dans votre fonction de promesse, vous ne l'attraperez pas et vous obtiendrez une exception de noeud. C'est pourquoi vous avez le message d'avertissement suivant: Unhandled promise rejection

0

Vous obtenez ce message d'erreur parce que vous ne répondez pas lorsque la promesse rejette plutôt que de se résoudre.

Dans votre code où vous appelez '.then', c'est à ce moment que la promesse a été résolue. Mais vous n'avez aucune action pour quand la promesse est rejetée. Prenons l'exemple suivant.

// psuedo promise function which resolves if the data is good and rejects if the data is bad 
function myPromiseFunction() { 
    return new Promise((resolve,reject) => { 
     // do something like make a http call here... 
     // if the response is good 
     return resolve(response) 
     // if the response is not so good 
     return reject(error) 
    }); 
} 

// using the promise function 
myPromiseFunction() 
    .then((response) => { 
     console.log(response); 
    }, (error) => { // <---- you are missing this part 
     console.log(error); 
    }); 

ou vous pouvez l'écrire de cette façon

myPromiseFunction() 
    .then((response) => { 
     console.log(response); 
    }) 
    .catch((error) => { // <---- you are missing this part 
     console.log(error); 
    })