2017-01-13 7 views
0

Ich bin sehr neu zu Mungo und Javascript versprechen. Ich werde Update-Abfrage in der globalen Versprechen Art und Weise schreiben und mein Code in der folgenden-Kann UnhandledPromiseRejectionWarning Problem in meiner Mungo-Abfrage nicht lösen

metadataAPI.route('/:surveyID') 
    .put(function(req, res) { 
     Surveys.findOne({_id : req.params.surveyID}, {"metadata" : 1}) 
      .then(function(survey) { 
       return survey.metadata; 
      }) 
      .catch(function(err) { 
       res.json({ Message : "Incorrect surveyID!"}); 
      }) 
      .then(function(metadata) { 
       Surveys.findOneAndUpdate(
         {_id : req.params.surveyID}, 
         { 
          $set : { 
           "metadata.language" : req.body.language || metadata.language, 
           "metadata.createdBy" : req.body.createdBy || metadata.createdBy, 
           "metadata.qCount" : req.body.qCount || metadata.qCount, 
           "metadata.category" : req.body.category || metadata.category, 
           "metadata.suggestionEnable" : req.body.suggestionEnable || metadata.suggestionEnable, 
           "metadata.publish" : req.body.publish || metadata.publish, 
           "metadata.pageArray" : req.body.pageArray || metadata.pageArray 
          } 
         } 
        ) 
        .then(function() { 
         Surveys.findOne({_id : req.params.surveyID}, {"metadata" : 1}) 
          .then(function(survey) { 
           res.json(survey); 
          }) 
          .catch(function(err) { 
           res.send(err); 
          });   
        }) 
        .catch(function(err) { 
         res.send(err); 
        }); 
      }) 
      .catch(function(err) { 
       res.send(err); 
      }); 
    }); 

Mein Problem ist, dass, obwohl ich habe den Fang() -Prozedur nach jeder der dann() Funktion. Ich bekomme immer noch das UnhandledPromiseRejectionWarning von Knoten. Wie kann ich es lösen? Vielen Dank!

+0

Ihre Hauptprobleme sind, dass Sie nicht richtig verkettet sind ('Return' von Ihren 'then' Callbacks, setzen Sie einen' catch' am Ende) und dass Sie 'Surveys.findOneAndUpdate' aufrufen, wenn Sie eine falsche ID haben, wie du * das * schon im 'catch' gehandhabt hast. – Bergi

+0

Was ist der Stack-Trace? Was ist die Fehlermeldung? – Bergi

+0

Danke Bergi! – Randal

Antwort

0

Einer der Vorteile von Versprechen ist, dass Sie eine Folge von asynchronen Operationen reduzieren können. Ohne Bewertung etwas über Ihre Logik habe ich die Operationen abgeflacht, das Hinzufügen eines Fang am Ende für jeden Fehler, der entlang der Kette geschieht ..

Surveys.findOne({_id : req.params.surveyID}, {"metadata" : 1}).then(function(survey) { 
    var metadata = survey.metadata; 
    return Surveys.findOneAndUpdate({_id : req.params.surveyID}, 
     { 
      $set : { 
       "metadata.language" : req.body.language || metadata.language, 
       "metadata.createdBy" : req.body.createdBy || metadata.createdBy, 
       "metadata.qCount" : req.body.qCount || metadata.qCount, 
       "metadata.category" : req.body.category || metadata.category, 
       "metadata.suggestionEnable" : req.body.suggestionEnable || metadata.suggestionEnable, 
       "metadata.publish" : req.body.publish || metadata.publish, 
       "metadata.pageArray" : req.body.pageArray || metadata.pageArray 
      } 
     } 
    ) 
}).then(function() { 
    return Surveys.findOne({_id : req.params.surveyID}, {"metadata" : 1}); 
}).then(function(survey) { 
    res.json(survey); 
}).catch(function(err) { 
    res.send(err); 
}); 

Quick Hinweis auf den Inhalt, kann ich mich nicht erinnern, wenn Mungo erfordert dass Sie .exec() an die Abfrageoperationen ketten, um Versprechen zurückzubekommen.

+0

Danke danh. Ich bekomme das Waring-Problem gelöst. – Randal

+0

In Bezug auf '.exec()' - es [tat] (http://stackoverflow.com/q/41247012/1048572) erfordern es, wenn Sie unbehandelte Ablehnungen vermeiden wollte :-) – Bergi

+0

Zeig mir, wie man den Code sehr flach machen Hilfe!!! Das was ich versuche zu tun, kann es aber nicht richtig machen. – Randal