Mon goose Схема предварительного сохранения не возвращается при вызове next () - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь создать простое приложение, которое требует регистрации пользователя и функциональности входа в систему. Я определил пользовательскую схему следующим образом:

// User Schema
const userSchema = new mongoose.Schema({
    username: {
        type: String,
        required: true, 
        trim: true,
    },
    password: {
        type: String,
        required: true,
        minlength: 7,
        trim: true,
        validate(value) {
            if (value.toLowerCase().includes('password')) {
                throw new Error('Password cannot contain "password"')
            }
        }
    },
    email: {
        type: String,
        unique: true,
        required: true,
        trim: true,
        lowercase: true,
        validate(value) {
            if (!validator.isEmail(value)) {
                throw new Error('Email is invalid')
            }
        }
    },
    name: {
        // TODO : Add validation for name
        type: String,
        required: true
    },
    mobile:{
        // TODO : Add validation for mobile numbers
        type: String
    }
}, {
    timestamps: true
});

userSchema.pre('save', async function (next) {
const user = this
console.log("inside pre")

if (user.isModified('password')) {
    console.log("about to hash ", user.password )
    user.password = await bcrypt.hash(user.password, 8)
    console.log("hashed pwd ", user.password )
}
next();
})

, и в моих маршрутах у меня есть следующее:

router.post('/users', async (req, res) => {

    const user = new User(req.body)

    try {
        console.log("about to save ")
        await user.save()
        console.log("About to gen token")
        const token = await user.generateAuthToken()
        console.log("About to send  res")
        res.status(201).send({ user, token })
    } catch (e) {
        res.status(400).send(e)
    }
})

Исходный пароль и открытый текст печатаются, но ответ никогда не получается послал. Строка сразу после вызова функции сохранения никогда не выполняется. Почему это может происходить?

1 Ответ

1 голос
/ 17 марта 2020

Удалить async из .pre('save'. Вы не можете смешивать обещания с обратными вызовами. Вы можете использовать любой, но вы не можете использовать оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...