Обратный вызов Mongoose find () на самом деле не вызывается - PullRequest
0 голосов
/ 10 января 2019

Я новичок в Mongoose, а также использую async / await. Сейчас у меня есть схема Mongoose со статическим методом, например:

const userSchema = new Schema({
    username: String,
    pass: String
});


userSchema.statics.checkExist = async function(username){
    return await this.findOne({username: username}, function(err, res){
        if(err){
            return err;
        }
        if(res){
            return true;
        }
        else{
            return false;
        }
    })
}

Статический метод checkExist() должен принимать имя пользователя и проверять, существует ли документ с таким же именем пользователя. Если это так, он должен вернуть true, иначе false. Я использую его на своем сервере NodeJS / Express следующим образом:

router.post('/auth/login', async (req, res) =>{
    let username = req.body.username;

    let existBool = await UserModel.checkExist(username);

    console.log(existBool);
    res.send({'hash': existBool});
});

Я ожидаю, что existBool будет истинным / ложным логическим значением. Вместо этого checkExist(), кажется, вообще не вызывает функцию обратного вызова. Вместо этого он возвращает результат findOne(), который является объектом с соответствующим полем имени пользователя. Что я тут не так делаю?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Это схема

const mongoose = require('mongoose');

var userSchema = new mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    username: {
        type: String,
        required: true,
        unique: true
    },
    password: {
        type: String,
        required: true
    }
}, {
        timestamps: { createdAt: true, updatedAt: true },
        collection: 'users'
    });

module.exports = mongoose.model("User", userSchema);

Конечная точка маршрутизатора находится ниже

// API endpoint to insert new user.
router.post('/insertUser', function (req, res, next) {
    let request = req.body;
    let userSchema = new UserModel({
        _id: new mongoose.Types.ObjectId(),
        username: request.username,
        password: request.password
    }); `enter code here`

    if (!userSchema.username) {
        res.status(200).json({ success: false, msg: 'Username can\'t be empty' });
    } else if (!userSchema.password) {
        res.status(200).json({ success: false, msg: 'Password can\'t be empty' });
    } else {
        // If username is not unique in schema do check this...
        UserModel.findOne({ username: userSchema.username }).exec()
            .then(result => {
                if (result == null) {
                    //Here the User is added
                    userSchema.save().then(result => {
                        res.status(200).json({ success: true, msg: 'User Added' });
                    }).catch(exception => {
                        console.log(exception);
                        res.status(200).json({ success: false, msg: 'Something went wrong' });
                    });
                } else {
                    res.status(200).json({ success: false, msg: 'Username already taken' });
                }
            }).catch(exception => {
                console.log(exception);
                res.status(200).json({ success: false, msg: 'Something went wrong' });
            });
    }

});
0 голосов
/ 10 января 2019

Вы смешиваете обратные вызовы с async/await, который использует обещания. Вы также неправильно понимаете, как работают обратные вызовы; Результат await - это не возвращаемое значение обратного вызова, а возвращаемое значение findOne().

await используется для удержания до тех пор, пока асинхронная функция не возвращает обещание, а затем "разворачивает" это обещание в переменную. Если метод findOne() поддерживает обещания, вам вообще не следует использовать обратные вызовы.

let result = await this.findOne({username: username})

Причина, по которой async/await настолько мощен, заключается в том, что он устраняет необходимость в синтаксисе .then() обещаний и позволяет снова писать последовательный код, но обрабатывает асинхронное поведение. Он позволяет вам использовать циклы и, самое главное, позволяет использовать операторы try/catch для повторной обработки ошибок.

try {
  let result = await this.findOne({username: username})
} catch(ex) {
  // handle exception here
}
...