Я получаю проблемы в пн goose обратная связь в пользовательской проверки - PullRequest
0 голосов
/ 21 апреля 2020

Я использую express -validator и сделал одну пользовательскую проверку с mon goose находкой базы данных, теперь я не могу отправить с сообщением. Вот мой код, хотя процесс остановки остановился на ошибке, но он не показывает сообщение в Json, но при создании пользователя он показывает все.

        body('mobile', 'Mobile number is required')
          .custom((value, {req, loc, path}) => {
            User.countDocuments({mobile: value}, function (err, c) {
              if (err) {
                console.log('An error happen in db')
              }
              if (c > 0) {
                throw new Error('Mobile already  exists finally')
              } else {
                return value
              }
            })
            return value
          })
          .withMessage('Mobile already exists'),

Ниже приведен журнал консоли

functions: Beginning execution of "app"
>  events.js:298
>        throw er; // Unhandled 'error' event
>        ^
>
>  Error: Mobile already  exists finally
>      at /Users/kamal/Documents/personal/asghar/codes/functions/app/controllers/users_controller.js:117:23
>      at /Users/kamal/Documents/personal/asghar/codes/functions/node_modules/mongoose/lib/model.js:4849:16
>      at /Users/kamal/Documents/personal/asghar/codes/functions/node_modules/mongoose/lib/model.js:4849:16
>      at /Users/kamal/Documents/personal/asghar/codes/functions/node_modules/mongoose/lib/helpers/promiseOrCallback.js:24:16
>      at /Users/kamal/Documents/personal/asghar/codes/functions/node_modules/mongoose/lib/model.js:4872:21
>      at /Users/kamal/Documents/personal/asghar/codes/functions/node_modules/mongoose/lib/query.js:4379:11
>      at /Users/kamal/Documents/personal/asghar/codes/functions/node_modules/kareem/index.js:135:16
>      at processTicksAndRejections (internal/process/task_queues.js:79:11)
>  Emitted 'error' event on Function instance at:
>      at /Users/kamal/Documents/personal/asghar/codes/functions/node_modules/mongoose/lib/model.js:4851:13
>      at /Users/kamal/Documents/personal/asghar/codes/functions/node_modules/mongoose/lib/helpers/promiseOrCallback.js:24:16
>      [... lines matching original stack trace ...]

Мне нужно добавить, если условие около return value, но проблема в том, что обратный вызов не возвращает мне значение c здесь, выше он корректен и даже останавливается из-за ошибки Ошибка, но я не хочу поднимать вместо ошибки хочу go далее withMessage('Mobile already exists') Я уверен, что сделал ошибку в обратном вызове. Пожалуйста, предложите решение

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Это должно работать

body("mobile").custom(value => {
    return User.countDocuments({ mobile: value })
        .then(count => {
            if (count > 0) return Promise.reject("Mobile number already exists");
        })
        .catch(error => console.error(error.message));
});

Из express -validator документация

Пользовательские валидаторы могут возвращать Promises для обозначения асинхронной проверки c (что будет ожидаться), или выбросить любое значение / отклонить обещание использовать пользовательское сообщение об ошибке. Примечание: если ваш пользовательский валидатор возвращает обещание, он должен отклонить, чтобы указать, что поле недействительно.

0 голосов
/ 24 апреля 2020

После воспроизведения и просмотра множества других документов я решил эту проблему, выполнив следующие действия: в моей модели User я добавил следующий код, так как моя модель на самом деле является модулем mon goose.

UserSchema.statics = {
  isValidMobile(mobile) {
    console.log(` Searching obile ${mobile} number `)
    return this.findOne({mobile: mobile}).then((result) => {
      if (result) throw new Error('Mobile Number already exists')
    })
  },
}

Теперь в моей проверке Я поставил следующую строку вместо строк выше.

        body('mobile', 'Mobile number is required')
          .custom((val) => User.isValidMobile(val))

Это сработало, и я получаю правильные сообщения с целым JSON, так как кажется, что пользовательский требует правильного ответа true / false, поэтому мой метод отвечает просто true или false, и он работает нормально с правильным сообщением, но используемое сообщение пришло из класса модели User, а не из проверки, но это работает. Спасибо за ответы.

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