2016-07-21 49 views
5

Önsöz: Neden benim JS vaat yakalama hata nesneler boş?

  • körük görülebilir req.helpers.consoleMessage fonksiyonu ve göstermek için tespit içinde basit mantığı ile bir fonksiyonudur Bluebird kullanılması ve Gelincik içinde mpromise değiştirilmesi Mongoose
  • kullanılması

    • Uygulama yapılandırmasında hata ayıklamasının varlığını ve görüntülenmekte olan nesnelerin boş olmayan/tanımsız durumunu temel alarak belirli bir ayrıntı düzeyi. Tüm iletiler JSON kullanılarak dizilir ve konsolda görüntülenecek şekilde döndürülür.

    Kodu: Burada

    Bu belirtileri gösteren bazı kod bir örnektir.

    Bu, üzerinde çalıştığım bir API'deki :team:comment birimler için bir delete yoludur. var response = user.comments; hattını user nesnesine işaret eden bir hatayla, aslında team numaralı çağrıya döndüğümde, çağrı işlevi tarafından döndürülen ve Promise .then()'a iletilmesi gereken bir hatayla ayrıldım. Bu, kullanıcı tanımlanmadığı için bir referans hatasına neden olmalıdır.

    var console = clim("(DELETE /api/v1/team/:team/comments/:comment):", logger); 
    
        // create a filters request for mongoose 
        var query = {}; 
    
        // determine if the :team param is a username or an object id 
        req.helpers.validateObjectId(req.db, req.params.team) ? query._id = req.params.team : query.name = req.params.team; 
    
        if(req.helpers.validateObjectId(req.db, req.params.comment)) { 
    
         // looks good; create an update object 
         var update = { $pull: { comments: { _id: req.params.comment } } }; 
    
         // find the comment using the query above and pull the comment id 
         req.models.Team.findOneAndUpdate(
          query, 
          update, 
          {safe: true, new : true} 
         ).then(function(team){ 
    
          if(!team){ 
    
           // create the response object 
           var response = { 
            success: false, 
            message: "Team not found" 
           }; 
    
           // log request 
           console.info(req.helpers.consoleMessage(req, response, null)); 
    
           // respond with an appropriate array 
           res.status(404).json(response); 
    
          }else{ 
    
           // create the response object using the teams's comments 
           var response = user.comments; 
    
           // log request 
           console.info(req.helpers.consoleMessage(req, response, null)); 
    
           // respond with the team comments array 
           res.status(200).json(response); 
    
          } 
    
         }).then(null, function(err){ 
    
          // create the response 
          var response = { success: false, message: req.config.debug ? err: "An error has occur with your request; please try again" }; 
    
          // log the errors 
          console.error(req.helpers.consoleMessage(req, response, err)); 
    
          // or send a 500 internal server error 
          res.status(500).json(response); 
    
         }); 
    
        }else{ 
    
         // create the response 
         var response = { success: false, message: "Comment id is not a valid object id" }; 
    
         // log the errors 
         console.info(req.helpers.consoleMessage(req, response, null)); 
    
         // or send a 500 internal server error 
         res.status(500).json(response); 
    
        } 
    

    Belirti:

    bir hata üretmek ve .catch() Hatalı durumdan kurtarmak için bir girişim ateşlenmesine neden olur bu yolu çağrılması ancak err nesne boş görünüyor.

    Ex. HTTP Yanıtı: { success: false, message: {} }

    Ör. (Netlik için kısaltılmış) Konsolu günlük { req: {...}, res: {...}. err: {} }

    Sonuç:err nesne boş görünüyor

    ...

  • cevap

    8

    Sorun:

    kendisi tarafından teselli hata nesnesi açılıyor nesnenin gerçekten boş olmadığını ve err.message gibi yakalama özelliklerinin çok uygun olduğunu ortaya çıkaracaktır.

    Sorun, JS Error nesnesinin JSON kullanılarak saf olarak dizilememesidir. Bu - bu problemle başa çıkmanın yolları ile birlikte - ilgili SOF Sorusunda ayrıntılı olarak anlatılmıştır: Is it not possible to stringify an Error using JSON.stringify?.

    Güncelleme kod:

    belirli hatanın ayrıntılarını güncellenmiştir HTTP yanıtı ve yardımcı fonksiyonu (daha önce açıklanan) gösterilir mesaj belirtmek için yapılmıştır Aşağıdaki kod değişiklikleri gösterilecek : Ör: { err: { message: err.message, stack: err.stack } } ve benzeri.

    var console = clim("(DELETE /api/v1/team/:team/comments/:comment):", logger); 
    
        // create a filters request for mongoose 
        var query = {}; 
    
        // determine if the :team param is a username or an object id 
        req.helpers.validateObjectId(req.db, req.params.team) ? query._id = req.params.team : query.name = req.params.team; 
    
        if(req.helpers.validateObjectId(req.db, req.params.comment)) { 
    
         // looks good; create an update object 
         var update = { $pull: { comments: { _id: req.params.comment } } }; 
    
         // find the comment using the query above and pull the comment id 
         req.models.Team.findOneAndUpdate(
          query, 
          update, 
          {safe: true, new : true} 
         ).then(function(team){ 
    
          if(!team){ 
    
           // create the response object 
           var response = { 
            success: false, 
            message: "Team not found" 
           }; 
    
           // log request 
           console.info(req.helpers.consoleMessage(req, response, null)); 
    
           // respond with an appropriate array 
           res.status(404).json(response); 
    
          }else{ 
    
           // create the response object using the teams's comments 
           var response = team.comments; 
    
           // log request 
           console.info(req.helpers.consoleMessage(req, response, null)); 
    
           // respond with the team comments array 
           res.status(200).json(response); 
    
          } 
    
         }).then(null, function(err){ 
    
          // create the response 
          var response = { success: false, message: req.config.debug ? err.message : "An error has occur with your request; please try again" }; 
    
          // log the errors 
          console.error(req.helpers.consoleMessage(req, response, err)); 
    
          // or send a 500 internal server error 
          res.status(500).json(response); 
    
         }); 
    
        }else{ 
    
         // create the response 
         var response = { success: false, message: "Comment id is not a valid object id" }; 
    
         // log the errors 
         console.info(req.helpers.consoleMessage(req, response, null)); 
    
         // or send a 500 internal server error 
         res.status(500).json(response); 
    
        } 
    

    Neden böyle basit bir kavram paylaşıyorum?

    Ben sözümü zincir yapıları ile yanlış ne yaptığını anlamaya çalışıyorum saatlerce arandı ve anahtar kelimeleri (JS Promises ilgili kelimelerin her kombinasyonu ile birlikte) empty ve error kullanılan ancak Aramalarımla hiçbiri herhangi bir şey ile geldi Buna doğru yaklaştığımı doğrulamaktan başka faydalıdır. Her şey yardımcı betiğimle iyi görünüyordu ve err nesnesini doğrudan konsola çıkarmaya çalışırken sorunun ne zaman olduğunu anlayabilmek için doğru hata ayıklama adımlarını gerçekleştiremedim (neden bunu yapmalıyım?) ? Zaten öyle ya da öyle düşündüm).

    Yani sanırım kimsenin, benzer bir duruma girmesi ve "nedenlerimin amaçlandığı gibi çalışmamaları neden" diye düşündüğü durumlarda bir kısmını kurtarmaya çalıştığımı söyleyebilirim. ve benim gibi yanlış yönde arama yapıyor.

    Mutlu Kodlama!

    +0

    Cool! Paylaştığın için teşekkürler. – danilodeveloper

    +2

    Hah, aynı hatayı yaptım. Bu benim için bugün yığın yığınındaki en yararlı şey. Teşekkürler. – jlegler