Избегайте использования вложенных обещаний для проверки - PullRequest
0 голосов
/ 09 мая 2020

Я использую node и mongoDB для создания серверной службы.

У меня есть следующая схема:

const UserSchema = new Schema({
    name : {
        type : String,
        required : true
    },
    email : {
        type : String,
        required : true
    },
    phoneNo : {
        type : Number,
        required : true
    },
    password : {
        type : String,
        required : true
    },
    avatar : {
        type : String
    },
    date  : {
        type : Date,
        default : Date.now()
    }
})

Теперь я хочу проверить, существует ли номер телефона и адрес электронной почты. Для этой проверки у меня есть следующий фрагмент кода:


User.findOne({ email : req.body.email })
        .then(user => {
            if (user){ 
                errors.email = 'Email already exists';
                return res.status(400).json(errors);
            } else {
                User.findOne( {phoneNo : req.body.phoneNo})
                .then (user => {
                    if(user) {
                        errors.phoneNo = 'Phone no already exists';
                        return res.status(400).json(errors);
                    }
                    else {
                    .....

Итак, я использую вложенное обещание. Я считаю, что это не лучший способ использовать go. Но мне нужно показать разные сообщения проверки для разных точек. Можно ли достичь этого более простым способом?

Ответы [ 2 ]

1 голос
/ 16 мая 2020

Вы можете сделать адрес электронной почты и номер телефона уникальными (рекомендуется) и проверить наличие ошибок дублирования, обработанных mon goose.

    email : {
        type : String,
        required : true,
        unique : true // add unique option
    },
    phoneNo : {
        type : Number,
        required : true,
        unique : true // add unique option
    },

This package mon goose -unique-validator вернет поле, вызывающее ошибку дублирования. Но вы также можете справиться с ошибкой дублирования самостоятельно, как предлагается здесь , но вам нужно будет самостоятельно проверить индекс, чтобы увидеть, какое поле вызвало дублирование

Вышеупомянутые подходы будут обрабатывать ошибки дублирования, когда вы вставляете / обновляете документ, поэтому текущий код проверки вам не понадобится.

В целях улучшения процесса проверки, если вы хотите избежать вложенных обещаний, вы можете вызывать их одновременно, используя Promise.all()

/* without async/await */

Promise.all([
  User.findOne({ email: req.body.email }).exec(),
  User.findOne({ phoneNo: req.body.phoneNo }).exec()
]).then(([emailUser, phoneUser]) => {
  if (emailUser) {
    errors.email = "Email already exists";
    return res.status(400).json(errors);
  }

  if (phoneUser) {
    errors.phoneNo = "Phone no already exists";
    return res.status(400).json(errors);
  }
})


/* with async/await */

const [emailUser, phoneUser] await Promise.all([
  User.findOne({ email: req.body.email }).exec(),
  User.findOne({ phoneNo: req.body.phoneNo }).exec()
])
if (emailUser) {
  errors.email = "Email already exists";
  return res.status(400).json(errors);
}

if (phoneUser) {
  errors.phoneNo = "Phone no already exists";
  return res.status(400).json(errors);
}
1 голос
/ 09 мая 2020

Вы можете использовать async/await, что сделает ваш код более простым и понятным.

async function main() {
    const existingByEmail = await User.findOne({ email: req.body.email });

    if (existingByEmail) {
        errors.email = "Email already exists";
        return res.status(400).json(errors);
    }

    const existingByPhone = await User.findOne({ phoneNo: req.body.phoneNo });

    if (existingByPhone) {
        errors.phoneNo = "Phone no already exists";
        return res.status(400).json(errors);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...