Учетная запись Регистрация с приложением узла экспресс продолжает загрузку в почтальоне - PullRequest
1 голос
/ 01 мая 2019

Я работаю с nodejs, и я создал модель регистрации для пользователя, но после запуска в почтальоне, нет ответа или сбоя. Я просто застрял там и получил следующий ответ в моем терминале

UnhandledPromiseRejectionWarning: необработанное отклонение обещания. это ошибка возникла либо при броске внутри асинхронной функции без блокировки, или отклонив обещание, которое не было обработано с .catch (). (идентификатор отклонения: 1) (узел: 12675) [DEP0018] DeprecationWarning: Отклонения необработанных обещаний устарели. В будущее, обещания отклонения, которые не обрабатываются, прекратят Процесс Node.js с ненулевым кодом выхода

ниже код моей модели

const AccountSchema = new mongoose.Schema(
    {
        fullName: {
            type: String,
            require: true,
            minlength: 2
        },
        email: {
            type: String,
            required: true,
            trim: true,
            minlength: 1,
            unique: true,
            validate: {
                validator: validator.isEmail,
                message: '{VALUE} is not a valid email'
            }
        },
        password: {
            type: String,
            require: true,
            minlength: 6
        },

        token: {
            type: String,
            required: true
        },
        timestamp: {
            type: Date,
            default: Date.now
        }

    }
);

AccountSchema.methods.toJSON = function () {
    const user = this
    const userObject = user.toObject()

    return _.pick(userObject, ['_id','fullName', 'email', 'token'])
}

AccountSchema.methods.generateAuthToken = function () {
    let user = this
    const today = new Date();
    const expirationDate = new Date(today);
    expirationDate.setDate(today.getDate() + 60);
    const token = jwt.sign({
        email: user.email,
        _id: user._id.toHexString(),
        exp: parseInt(expirationDate.getTime() / 1000, 10),
    }, 'process.env.JWT_SECRET').toString()

    user.token.push({
        token
    })

    return user.save().then(() => {
        return token
    })
}

AccountSchema.pre('save', function (next) {
    let user = this

    if (user.isModified('password')) {
        bcrypt.genSalt(10, (err, salt) => {
            bcrypt.hash(user.password, salt, (err, hash) => {
                user.password = hash
                next()
            })
        })
    } else {
        next()
    }
})

const Account = mongoose.model('Account', AccountSchema)

в моем контроллере, у меня есть это

1012 * минусы *

t _ = require('lodash')
const {Account} = require('../models/account')

exports.register = (req, res, next) => {
    const body = _.pick(req.body, ['fullName', 'email', 'password'])
    console.log(body)
    const account = new Account(body)
    account.save().then(() => {
        return account.generateAuthToken()
    }).then((token) => {
        res.header('Authorization', token).send(account)
    }).catch((e) => {
        res.status(400).send(err)
    })
}

тогда мой почтальон такой

{
    "fullName": "Adie Olami",
    "email": "ugbe@gmail",
    "password": "123456"
}

позвольте мне также добавить, я новичок в узле и все еще учусь, поэтому любая помощь приветствуется

Ответы [ 2 ]

3 голосов
/ 01 мая 2019

Очень простое решение с использованием async/await:

t _ = require('lodash')
const {Account} = require('../models/account')

exports.register = async (req, res, next) => {
    const body = _.pick(req.body, ['fullName', 'email', 'password'])
    console.log(body)
    const account = new Account(body)
try {
    await account.save();
    const accessToken = await account.generateAuthToken()
    res.header('Authorization', token).send(account)
 } catch(err) {
    res.status(400).send(err)
 }
}
1 голос
/ 01 мая 2019

Консоль говорит вам, что вы неправильно обрабатываете ситуацию, когда обещание отклоняется в какой-то момент в вашем коде. Просматривая то, что вы опубликовали, я думаю, что проблема в следующем разделе:


return user.save().then(() => {
        return token
    })

Вы не обрабатываете возможность отклонения обещания от вашего звонка user.save (). Чтобы это исправить, вам нужно добавить блок catch в конце:


... user.save()
    .then(() => {
        return token
    })
    .catch((error) => {
        // Log out the error to see what is going on for debugging purposes
        console.error(error);
        // Handle the error - in this case I've added a throw() but you could perhaps just return an empty token, or whatever you need for your use case.
        throw error;
    })

Надеюсь, это поможет.

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