Как передать ошибку MongoDB в React из Express - PullRequest
0 голосов
/ 13 апреля 2019

Я работаю в приложении MERN. В одной из моих моделей express.js у меня есть уникальная схема электронной почты, как показано ниже

email: {
   type: String,
   trim: true,
   required: true,
   minlength: 3,
   unique: true
},

Я проверяю уникальность адреса электронной почты при сохранении записи, как показано ниже

address.save()
.then(address => {
   //other code
})
.catch(err => {
   console.log(err);
   res.status(500).json({
     message: 'Error Occured',
         error: err
   });
 });

Я получаю ошибку ниже в Терминале.

{ MongoError: E11000 duplicate key error collection: addresses.addresses index: email_1 dup key: { : "nowphp@yahoo.com" }
[0]     at Function.create (/home/foysal/Videos/my-app/node_modules/mongodb-core/lib/error.js:43:12)
[0]     at toError (/home/foysal/Videos/my-app/node_modules/mongodb/lib/utils.js:149:22)
[0]     at coll.s.topology.insert (/home/foysal/Videos/my-app/node_modules/mongodb/lib/operations/collection_ops.js:859:39)
[0]     at /home/foysal/Videos/my-app/node_modules/mongodb-core/lib/connection/pool.js:532:18
[0]     at process._tickCallback (internal/process/next_tick.js:61:11)
[0]   driver: true,
[0]   name: 'MongoError',
[0]   index: 0,
[0]   code: 11000,
[0]   errmsg:
[0]    'E11000 duplicate key error collection: addresses.addresses index: email_1 dup key: { : "nowphp@yahoo.com" }',
[0]   [Symbol(mongoErrorContextSymbol)]: {} }

enter image description here

Я хотел бы изменить эту ошибку errmsg: 'E11000 duplicate key error collection: addresses.addresses index: email_1 dup key: { : "nowphp@yahoo.com" }', на Email already Exists и передать ее в React (передний конец).

Как я могу это сделать?

UPDATE

Я использую код ниже express.js

address.save()
    .then( address => {
        // others code
    })
    .catch( err => {
        const errString = err.toString();
        if (errString.includes("E11000")) return res.status(404).json({ err: 'That email is already in use!' });
    });

Действие My React Redux похоже на

export const addAddress = value => dispatch => {
  return Axios.post('/api/address', value)
    .then( response => {
      // other code
    })
    .catch( error => {
      console.log('actionError', error )
    });
};

Я получаю ошибку ниже в консоли

Error: "Request failed with status code 404"

enter image description here

Ответы [ 2 ]

2 голосов
/ 13 апреля 2019

Что ж, если вы посмотрите на регистрируемый объект Error, вы можете наблюдать некоторые вещи, такие как свойство code.

Вы можете оценить это свойство, и в этом случае просто передать соответствующее пользовательское сообщение об ошибке.

address.save()
.then(address => {
   //other code
})
.catch(err => {
   const {code} = err
   console.log(err);
   if (code === 11000) {
     err = new Error('Email already Exists');
   }
   res.status(500).json({
     message: 'Error Occured',
     error: err
   });
 });
1 голос
/ 13 апреля 2019

У вас есть два варианта: проверить, существует ли электронное письмо до создания (лучший вариант) или разрешить Mongo выдавать error object во время создания пользователя, преобразовать его в string и затем проверить, включает ли это string E11000.

Рабочий пример : https://github.com/mattcarlotta/fullstack-mern-kit (нажмите здесь , чтобы просмотреть используемый код, как описано ниже; кроме того, приведенный ниже код относитсяк статическому методу пользователя, который вы можете найти здесь )


Например (выберите один вариант, вам не нужны оба):

const createUser = async (req, res, done) => {
  const {
    email,
    firstName,
    lastName,
    userName,
    backgroundInfo,
    address,
  } = req.body;

  if (
    !email
    || !firstName
    || !lastName
    || !userName
    || !backgroundInfo
    || isEmpty(address)
  ) return res.status(400).json({ err: “You must include all required fields to create a new user!” }); // checking if the req.body contains all the required user fields

  try {
    const emailTaken = await User.findOne({ email });
    if (emailTaken) return res.status(400).json({ err: “That email is already in use!" }); // checking if the user exists before creation

    await User.createUser(req.body); // createUser is a custom static method placed on the model

    res
      .status(201)
      .json({ message: `Successfully created ${req.body.userName}.` });
  } catch (err) {
    const errString = err.toString();

    if (errString.includes("E11000")) return res.status(400).json({ err: “That email is already in use!" }); // handling the error Mongo throws if the user exists during creation

    return res.status(400).json({ err: errString }); // handling any other misc errors
  }
};

По умолчанию axios не возвращает ошибку с сервера.Вместо этого вам нужно будет создать пользовательскую конфигурацию axios: axiosConfig.js .Наиболее важной частью этой конфигурации является изменение ошибки interceptor, как показано здесь .Это специально ищет ошибку от error.response.data.err.Если вы не используете err для API, вам нужно обновить эту строку .

Цель этой строки - проверить, существует ли error.response.data.err, если нет, то он возвращает общее Network Error (error.message) сообщение.

После того, как вы создали эту конфигурацию, вам нужно будет использовать ее для всего приложения (import axios from '../path/to/axiosConfig').

ПРИМЕЧАНИЕ : обновите baseURL до вашего API localhost, и оно будет port.Преимущество использования этой конфигурации заключается в том, что к любым вызовам, которые вы делаете с помощью axios, будет добавляться http://localhost:port/.

Например, вместо:

axios.get("http://localhost:5000/api/user")

это будет:

axios.get("user")

Если у вас есть вопросы, прежде чем спрашивать, пожалуйста, обратитесь к репозиторию github выше, поскольку он показывает, как интегрировать все.Если вы планируете использовать это в производственной среде, вам нужно будет использовать ENV (в этом примере используется пакет better-npm-run , но вы можете использовать cross-env или dotenv ).

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