Я создаю свой 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 ошибок. В любом случае, как я могу это сделать и не передавать данные избыточности?
Вы можете просто проанализировать объект ошибки, прежде чем отправлять его во внешний интерфейс.
Вот как вы могли бы сделать это с помощью цикла.
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});
}
прогнозы
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")
})
Не тестировали