Как передать только сообщения об ошибках из модели в контроллер (Mongoose)?

1

Я создаю свой node.js api и хочу передавать только сообщения обратного вызова об ошибках. Теперь мне нужно иметь дело с объектом вроде этого

{
    "success": false,
    "msg": {
        "errors": {
            "email": {
                "message": "test@tes is not a valid email!",
                "name": "ValidatorError",
                "properties": {
                    "type": "user defined",
                    "message": "{VALUE} is not a valid email!",
                    "path": "email",
                    "value": "test@tes"
                },
                "kind": "user defined",
                "path": "email",
                "value": "test@tes"
            },
            "username": {
                "message": "The Username is not long enough",
                "name": "ValidatorError",
                "properties": {
                    "type": "user defined",
                    "message": "The Username is not long enough",
                    "path": "username",
                    "value": "te"
                },
                "kind": "user defined",
                "path": "username",
                "value": "te"
            }
        },
        "_message": "Users validation failed",
        "name": "ValidationError"
    }
}

Вот мой код userModel.js

/* Custom Validation */
const validator = (v)=> {
    return v.length > 5;
};
/* END of Custom Validation */

const UserSchema = new Schema({
        username: {
            type: String,
            validate: [
                validator,
                'The Username is not long enough'
            ],
            required: [true, 'The Username is required'],
            unique: true,
            lowercase: true
        },
        password: {
            type: String,
            required: [true, 'The Password is required']
        },
        email: {
            type: String,
            validate: [
                (v)=> { return /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i.test(v)},
                '{VALUE} is not a valid email!'
            ],
            lowercase: true,
            required: true
        },
        role: {
            type: [{
                type: String,
                enum: ['user', 'manager', 'admin']
            }],
            default: ['user']
        },
        team: {
            type: [{
                type: String,
                enum: ['IHLO', 'ADULT&SH', 'IPJ', 'ISD', '']
            }],
            default: ['']
        },
        created_date: {
            type: Date,
            default: Date.now
        },

    });

    UserSchema.pre('save', ...

    UserSchema.methods.comparePassword = ...

    module.exports = mongoose.model('Users', UserSchema);
**userController.js**

    / Register new user
    exports.signup = (req, res)=> {

        let new_user = new User(req.body);
        new_user.save((err, new_user)=> {
            if (err)
                return res.json({success: false, msg: err});
            res.json({success: true, msg: 'Successful created new user ${new_user.username}.'});
        });
    };

Конечно, я могу сделать функцию на интерфейсе, который ищет ключи "сообщения", но для некоторых записей это может быть более 100 ошибок. В любом случае, как я могу это сделать и не передавать данные избыточности?

Теги:
mongoose

2 ответа

1
Лучший ответ

Вы можете просто проанализировать объект ошибки, прежде чем отправлять его во внешний интерфейс.

Вот как вы могли бы сделать это с помощью цикла.

if (err){
    let messages = [];
    for(let i in err){
        messages.push({
            field: i,
            message: err[i].message
        });
    }

    return res.json({success: false, msg: messages});
}

Вы также можете использовать библиотеку, такую как lodash, чтобы сделать ее немного чище.

if (err){
    let messages = _.flatMap(err, (value, key) => { field: key, message: value.message });
    return res.json({success: false, msg: messages});
}
  • 0
    спасибо за ваш ответ, но я стараюсь не разбирать объект.
  • 0
    похоже в этом случае это лучшее решение
0

прогнозы

User.find({}, {messages: 1}) или

User.find({},'messages')

вторым параметром является проекция mongoose api

Я думаю, вы также можете использовать User.find({},'messages -_id') чтобы оставить _id, но если вы используете объект, вы можете сделать {_id: 0}

Если вы хотите отфильтровать объекты с сообщениями об ошибках:

вы можете использовать .lean() для создания реального js-объекта

сделать что-то вроде

User.find({}).lean()
.then(users =>{
  user.filter(e => e.name == "ValidationError")
})

Не тестировали

  • 0
    Можно ли использовать проекцию с ошибками, возвращенными из сохранения?
  • 0
    Я сделал правку о фильтрации документов в серверной части
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню