Mongoose 유효성 검사 오류 처리 - 어디서 어떻게 처리합니까?
저는 Mongoose의 유효성 검사 오류를 어떻게 처리할지 결정하려고 합니다.
노드 검증기를 사용한 사용자 지정 오류 메시지
노드 검증기를 사용하여 자체 검증 규칙을 정의했습니다. 예:
UserSchema.path('username')
.validate(function (username) {
return validator.check(username).notEmpty()
}, 'Username cannot be blank')
그러면 다음과 같은 오류가 발생합니다.
username:
{ message: 'Validator "Username cannot be blank" failed for path username',
name: 'ValidatorError',
path: 'username',
type: 'Username cannot be blank' },
mongoose-validator 사용
그러나 노드 검증기는 자체 오류 메시지를 제공합니다.mongoose-validator Node 모듈을 사용하여 노드 검증기를 스키마에 직접 연결하면 대신 다음 오류 메시지를 직접 사용할 수 있습니다.
var UserSchema = new Schema({
name: { type: String, validate: [validate('notEmpty')] }
});
그러면 다음과 같은 오류 메시지가 생성됩니다.
name:
{ message: 'Validator "String is empty" failed for path name',
name: 'ValidatorError',
path: 'name',
type: 'String is empty' } }
사용자 지정 오류 메시지도 여기에 제공할 수 있습니다.
var UserSchema = new Schema({
name: { type: String, validate: [validate({message: 'Name cannot be blank' }, 'notEmpty')] }
});
required
Mongoose를 사용하여 필요에 따라 필드를 정의할 수 있습니다.
var UserSchema = new Schema({
name: { type: String, required: true }
});
그러면 다음과 같은 오류 메시지가 생성됩니다.
name:
{ message: 'Validator "required" failed for path name',
name: 'ValidatorError',
path: 'name',
type: 'required' } }
그 질문은
이 검증자들은 사용자가 기본 제공 오류 메시지를 사용하기를 원하는 것처럼 느껴집니다.예를 들어, 필드를 다음과 같이 선언합니다.required
위와 같이 오류 메시지를 사용자 지정할 방법을 찾을 수 없습니다.까지 사용자 합니다. mongoose-validator 모듈은 사용자 지정 메시지입니다. 이는 모델 수준에서 안티패턴이라고 생각하게 합니다.
이러한 검증자를 구현하는 가장 좋은 방법은 무엇입니까?그들이 스스로 오류를 생성하고 나중에 어떻게든 해석할 수 있도록 해야 할까요?
이 시점에서 몽구스가 오류를 처리하는 방법을 이해하는 것이 논리적으로 보입니다.
모델에서 오류 메시지를 처리하지 않도록 할 수 있습니다. 레이어는 "컨트롤러"에 의존해야 합니다.type
표시하기에 가장 좋은 사용자 친화적인 메시지를 결정합니다(i18n 고려).
미들웨어를 사용하여 검증이 이루어질 수도 있습니다.이 경우 컨트롤러에 표시되는 오류 메시지는 다음과 같이 전달됩니다.next()
콜백
따라서 미들웨어의 경우 문서화되지는 않았지만 모델 전체에서 일관된 검증 API를 유지하려면 Mongoose의 오류 생성자를 직접 사용해야 합니다.
var mongoose = require('mongoose');
var ValidationError = mongoose.Error.ValidationError;
var ValidatorError = mongoose.Error.ValidatorError;
schema.pre('save', function (next) {
if (/someregex/i.test(this.email)) {
var error = new ValidationError(this);
error.errors.email = new ValidatorError('email', 'Email is not valid', 'notvalid', this.email);
return next(error);
}
next();
});
이렇게 하면 유효성 검사 오류가 미들웨어에서 발생하더라도 일관된 유효성 검사 오류 처리가 보장됩니다.
오류 메시지를 유형과 적절하게 일치시키기 위해 가능한 모든 유형에 대한 정적 맵 역할을 하는 열거형을 만듭니다.
// my controller.js
var ValidationErrors = {
REQUIRED: 'required',
NOTVALID: 'notvalid',
/* ... */
};
app.post('/register', function(req, res){
var user = new userModel.Model(req.body);
user.save(function(err){
if (err) {
var errMessage = '';
// go through all the errors...
for (var errName in err.errors) {
switch(err.errors[errName].type) {
case ValidationErrors.REQUIRED:
errMessage = i18n('Field is required');
break;
case ValidationErrors.NOTVALID:
errMessage = i18n('Field is not valid');
break;
}
}
res.send(errMessage);
}
});
});
저는 검증기 플러그인이 아마도 도움이 될 것이라는 것을 알지만, 몽구스 검증 작업은 실제 복잡하기보다 더 위협적이라고 생각합니다.겉으로 보기에는 분명 복잡해 보이지만 일단 손을 떼기 시작하면 그렇게 나쁘지는 않습니다.
아래 코드를 체크아웃하면 내장된 검증기를 사용하여 사용자 지정 오류 메시지를 반환하는 방법의 예를 볼 수 있습니다.
필드를 설정할 때 사용자 정의 오류 메시지와 함께 두 번째 매개 변수를 설정하기만 하면 됩니다.
다음 항목을 확인하십시오.required
그리고.minlength
그리고.maxlength
사용자 지정 오류 메시지를 설정하는 방법을 보려면 아래 필드를 선택한 다음 오류 개체를 프런트 엔드로 액세스하거나 보낼 수 있는 방법을 확인하십시오.
// Grab dependencies:
var mongoose = require('mongoose');
// Setup a schema:
var UserSchema = new mongoose.Schema (
{
username: {
type: String,
minlength: [2, 'Username must be at least 2 characters.'],
maxlength: [20, 'Username must be less than 20 characters.'],
required: [true, 'Your username cannot be blank.'],
trim: true,
unique: true,
dropDups: true,
}, // end username field
},
{
timestamps: true,
},
);
// Export the schema:
module.exports = mongoose.model('User', UserSchema);
위의 내용은 사용자 정의 오류 메시지를 포함하도록 필드를 설정합니다.하지만 어떻게 액세스하거나 프런트 엔드로 전송할 수 있을까요?서버 컨트롤러에서 응답 데이터가 각도로 다시 전송되는 다음 방법을 설정할 수 있습니다.
var myControllerMethods = {
register : function(req, res) {
// Create a user based on the schema we created:
User.create(req.body)
.then(function(newUser) {
console.log('New User Created!', newUser);
res.json(newUser);
})
.catch(function(err) {
if (err.name == 'ValidationError') {
console.error('Error Validating!', err);
res.status(422).json(err);
} else {
console.error(err);
res.status(500).json(err);
}
})
},
};
위의의 몽구스 중 하지 못한 이 있다면 mongoose ")입니다.err
는 )에 ..catch()
메시지가 이 오류를 콘솔에 기록하면 플래그가 지정된 오류에 따라 해당 개체가 사용자 지정 메시지임을 알 수 있습니다.
의 예제는 이미 하고 있는 기본 (예: Mongoose와 같은)에 사용자 검사 입니다.required
,minlength
,maxlength
등).
에 대한 등과 정의▁custom▁if▁against▁valid,▁then▁more▁create▁advanced니생▁or야▁to를 해야 합니다.validator
기능들.
필드에 검증자를 바로 추가하는 방법에 대한 좋은 예는 다음 링크의 "Custom Validators" 섹션을 참조하십시오. http://mongoosejs.com/docs/validation.html
참고: "사전 저장 후크" 및 "인스턴스 메소드"를 사용할 수도 있지만, 이는 이 질문의 범위를 벗어나며 기본 제공 검증기 및 "사용자 정의 검증기"(앞에서 언급한 링크)가 더 쉬운 경로입니다.
이것이 도움이 되길 바랍니다!
출처: https://github.com/leepowellcouk/mongoose-validator
오류 메시지 사용자 지정 오류 메시지는 이제 0.2.1에 다시 포함되었으며 옵션 개체를 통해 설정할 수 있습니다.
validate({message: "String should be between 3 and 50 characters"}, 'len', 3, 50)
구현 방법:
var emailValidator = [validate({message: "Email Address should be between 5 and 64 characters"},'len', 5, 64), validate({message: "Email Address is not correct"},'isEmail')];
var XXXX = new Schema({
email : {type: String, required: true, validate: emailValidator} });
제 프런트 엔드는 필수 사항을 처리하기 때문에 몽구스 "필수" 오류가 사용자에게 발생할 것이라고 예상하지 않습니다. 백엔드 안전 가드에 가깝습니다.
여러분이 스스로에게 물어야 할 질문은 애초에 누가 오류를 일으킨 책임이 있는가 하는 것입니다.
만약 당신이 통제하고 있는 당신의 시스템에서 이런 일이 일어난다면, 당신이 평소에 했던 것처럼 오류가 발생하게 하고 버그를 제거하십시오. 하지만 당신은 실제 사용자들과 마주하고 있는 애플리케이션을 실행하고 있고 그들의 입력을 검사하고 싶을 것입니다.
클라이언트 측에서는 서버로 입력을 보내기 전에 입력이 올바른지 확인하고 "사용자 이름은 x자에서 y자 사이여야 합니다."와 같은 멋진 도우미 메시지를 표시하는 것이 좋습니다.
그런 다음 서버 측에서는 99%의 경우 데이터가 정화 클라이언트에서 직접 전송될 것으로 예상하고, 따라서 이미 제안한 기술을 사용하여 데이터를 검증합니다.그러나 오류가 있는 경우 일반 오류 메시지를 사용자 인터페이스에 반환하면 됩니다. 사용자 인터페이스가 도우미 메시지를 표시하여 유효성 검사 오류가 버그 또는 해킹 시도로 인해 발생할 수 있다고 신뢰할 수 있기 때문입니다.
심각한 버그일 수도 있고 악용하려는 사람이 있을 수 있으므로 모든 서버 측 유효성 검사 오류를 기록해야 합니다.
경고:Mongoose 4.1.3부터는 ValidatorError 함수의 서명이 완전히 변경되었으며 아래 정보는 더 이상 적용되지 않습니다.
Mongoose 3.8.12 기준으로 ValidatorError 함수의 서명은 다음과 같습니다.
function ValidatorError (path, msg, type, val)
여기서 type은 "not valid" 또는 "required"일 수 있습니다.
예를 들어 "이메일" 필드 유효성 검사에서 유효성 검사 오류가 발생한 경우 다음 작업을 수행할 수 있습니다.
var error = new ValidationError(this);
error.errors.email =
new ValidatorError('email', "Your err message.", 'notvalid', this.email);
mongoose 4.5.0 이후 Document#invalidate는 ValidationError를 반환합니다.다음을 참조하십시오. https://github.com/Automattic/mongoose/issues/3964
또한 findOneAndUpdate 쿼리 후크에서 무효화를 시도할 때 다음 작업을 수행할 수 있습니다.
// pass null because there is no document instance
let err = new ValidationError(null)
err.errors[path] = new ValidatorError({
path: 'postalCode',
message: 'postalCode not supported on zones',
type: 'notvalid',
value,
})
throw(err)
고유 인덱스 오류를 포함하여 mongoose 오류 메시지 템플릿을 사용자 지정하는 데 도움이 되는 hmv 패키지를 참조하십시오.
template : {PATH_NAME} must be at least {MIN_LENGTH} characters long
schema : { fullname : { type : String, min : 3, $name : 'Full name' } }
message : Full name must be at least 3 characters long
template : {PATH_NAME} {VALUE} have been used, please choose another
schema : { username : { type : String, unique : true } }
message : username MrBean have been used, please choose another
특히 베트남어로 현지화를 지원합니다.
template : {PATH_NAME} dài ít nhất {MIN_LENGTH} kí tự
schema : { fullname : { type : String, min : 3, $name : 'tên tài khoản' } }
message : Tên tài khoản dài ít nhất 5 kí tự
좋은 점은 이전 접근 방식에서 모든 스키마의 모든 필드를 사용자 정의하는 대신 메시지 템플릿을 한 번만 사용자 정의하면 된다는 것입니다.
여기서도 조이를 사용할 수 있습니다.실제로 노드 앱에서 스키마를 검증하는 데 매우 유용한 패키지입니다.
예:
const Joi = require("joi");
const validateUser = user => {
const Schema = {
email: Joi.string().email().required(),
name: Joi.string().min(3).max(20).required(),
password: Joi.string().min(8).max(25).required()
}
return Joi.validate(user, Schema);
}
의 경로 핸들러 파일이 mycontroller.js 파일은 입니다.
은 한 을 처리합니다.
// user object created from model
let user = new Users({
firstName: req.body.firstName,
lastName: req.body.lastName
...
});
// Since the Error response are in <Model Name>:<Schema Name>:<Error Message>, ...
var err = user.validateSync();
if (err && err.message) return res.send(err.message.split(':')[2].split(',')[0]);
1 - 오류를 확장하는 ErrorHandler 클래스 쓰기:
class ErrorHandler extends Error {
constructor(message, statusCode) {
// super calls the constructor of the parent class
super(message);
this.statusCode = statusCode;
// captureStackTrace returns a string that reperesents the location of that particular error in the call. gives us a stack that helps us to find the location of that error in the code. this will help us to find the exact error in our code.
// "this" is object itself, "this.constructor" constructor of this class
Error.captureStackTrace(this, this.constructor);
}
}
export default ErrorHandler;
2-쓰기 오류 미들웨어
import ErrorHandler from "../utils/errorHandler";
const errorMiddleware = (err, req, res, next) => {
err.statusCode = err.statusCode || 500;
let error = { ...err };
// Handling mongoose Validation error
if (err.name === "ValidationError") {
const message = Object.values(err.errors).map((value) => value.message);
error = new ErrorHandler(message, 400);
}
res.status(err.statusCode).json({
success: false,
error,
message: error.message,
stack: error.stack,
});
};
export default errorMiddleware;
언급URL : https://stackoverflow.com/questions/15012250/handling-mongoose-validation-errors-where-and-how
'sourcecode' 카테고리의 다른 글
RMagick 설치:Magick Wand를 찾을 수 없습니다. (0) | 2023.06.03 |
---|---|
MongoDB에 대한 IDE를 쿼리하시겠습니까? (0) | 2023.06.03 |
가로 세로 비율을 유지하기 위해 ImageView에서 이미지 크기를 조정하는 방법 (0) | 2023.06.03 |
Android에서 화면 너비 및 높이 가져오기 (0) | 2023.06.03 |
VB에서 주() 진입점을 찾는 방법.Net winforms 앱? (0) | 2023.06.03 |