Node.js mongodb и обещания

1

Я задал свой вопрос, и я получил ответ на другой ответ, но я не могу этого сделать: (Может кто-нибудь, пожалуйста, помогите мне? "

Мой главный вопрос: как получить доступ к данным из функции (node.js)

Я попытался сделать то, что было предложено. Он работает до тех пор, пока в mongodb не появится коллекция. Что произойдет, если нет коллекции? Im получает ошибку

(node:18) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Cannot read property 'userName' of undefined

Есть ли хороший и простой способ гарантировать, что моя функция будет работать, даже если нет коллекции?

Мой indeks.js

var userID = this.event.session.user.userId;
console.log(userID);
var self = this;
DbConn.dbFind("myUsers", userID).then(function(item) {

    self.emit(':ask',
        SpeechOutputUtils.pickRandom(self.t('WELCOME_OK', item.userName))
    );

    }, function(err) {
    self.emit(':ask',
        SpeechOutputUtils.pickRandom(self.t('WELCOME'))
    );
});

мой db.utilis

module.exports = {

    dbFind: function(collectionName, userID) {
            return MongoClient.connect(url).then(function(db) {
              var collection = db.collection(collectionName);

              return collection.findOne({alexaUserID:userID});
            }).then(function(item) {
                  return item;    
            });
          }
        };

1 ответ

1
Лучший ответ

Да, есть пара вещей, которые вы должны делать. Сначала добавьте обработчик catch вместо передачи второй функции, а then для ошибок по вашему возвращенному обещанию:

DbConn.dbFind("myUsers", userID)
.then(function(item) {
    if (!item) {
        // handle emtpy item her instead 
        // of using catch for program flow
        return  
    }
    self.emit(':ask',
        SpeechOutputUtils.pickRandom(self.t('WELCOME_OK', item.userName))
    );  
})
.catch( function(err) {
    // this will be an error that happens in the promise or the above then()
    self.emit(':ask',SpeechOutputUtils.pickRandom(self.t('WELCOME')));
});

Это легче читать, но, что более важно, catch() получит ошибки, которые произойдут в приведенном выше then() то время как другой шаблон не будет.

Кроме того, я бы тестировал item непосредственно в then() вместо того, чтобы ловить ошибку и действовать на нее. Использование catch таким образом затрудняет изоляцию реальных ошибок, таких как плохое соединение с БД.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню