Javascript 带有Express和Mongoose错误处理程序的节点和MongoDB使用';mongoose唯一验证器';

Javascript 带有Express和Mongoose错误处理程序的节点和MongoDB使用';mongoose唯一验证器';,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我想使用“mongoose unique validator”更轻松地处理Mongo ValidationError。当我试图强制执行ValidationError时,问题出现了,它甚至没有进入我的自定义错误处理程序。任何其他错误都可以正常工作,但这次不行 我只希望验证程序发送一个JSON响应,以便客户端应用程序可以看到哪个字段错误/不唯一。 handleErrors.js 常量错误\u处理程序={ //实际工作的示例处理程序。 JsonWebTokenError:(res)=>res.stat

我想使用“mongoose unique validator”更轻松地处理Mongo ValidationError。当我试图强制执行ValidationError时,问题出现了,它甚至没有进入我的自定义错误处理程序。任何其他错误都可以正常工作,但这次不行

我只希望验证程序发送一个JSON响应,以便客户端应用程序可以看到哪个字段错误/不唯一。

handleErrors.js
常量错误\u处理程序={
//实际工作的示例处理程序。
JsonWebTokenError:(res)=>res.status(401).json({error:'Token missing or invalid'}),
//不工作的处理程序
ValidationError:(res,{message})=>res.status(409.json({error:message}),
};
module.exports=(err、req、res、next)=>{
const handler=ERROR_HANDLERS[err.name];
处理程序(res,err);
};
User.js
const{Schema,model}=require('mongoose');
const uniqueValidator=require('mongoose-unique-validator');
const UserSchema=新模式({
用户名:{
类型:字符串,
独一无二:没错,
uniquecase:对,
特里姆:没错,
要求:正确,
},
电邮:{
类型:字符串,
独一无二:没错,
uniquecase:对,
小写:true,
特里姆:没错,
要求:正确,
},
密码哈希:{
类型:字符串,
特里姆:没错,
要求:正确,
},
});
plugin(uniqueValidator);
module.exports={
用户:模型('User',UserSchema),
};
index.js
app.use(批准者);
app.use('/api/users',userRouter);
应用程序使用(未找到);
应用程序使用(手柄错误);
userRouter.js
constusersrouter=require('express').Router();
const userController=require('../controllers/userController');
usersRouter.get('/',userController.listAll);
usersRouter.post(“/”,userController.create);
module.exports=usersRouter;
userController.js
create:async(req,res)=>{
const{body}=req;
const passwordHash=await bcrypt.hash(body.password,10);
const user=新用户({
…身体,
密码哈希,
});
const savedUser=wait user.save();
res.status(201).send(savedUser);
},
ValidationError触发器上的控制台输出
包装您的
const savedUser=wait user.save()在try catch块中捕获错误并在catch块中处理错误

create: async (req, res, next) => {
        const { body } = req;
        const passwordHash = await bcrypt.hash(body.password, 10);
        const user = new User({
            ...body,
            passwordHash,
        });
        try {
            const savedUser = await user.save();
            res.status(201).send(savedUser);
        }  catch (error) {
          console.log(error);
          next(error);
          // throw error; // you can throw error
          // res.status(422).send({ 'message': 'Validation error' }); // handle your error here
        }
    },

您是否可以将您的
userRouter.js
文件添加到
console.log(err)
@tusargupta curioustushar done!添加了userRouter.js。我没有添加console.log(err)btw,因为当错误是ValidationError时,它不会在错误处理程序上运行,但当它是另一个error.name时,它会运行。我的意思是,如果错误是ValidationError,它甚至不会进入处理程序,只会在控制台上抛出未处理的PromiserEjectionWarning。请添加
userController.create
函数的代码。@TusharGupta curioustushar doneSure,但我想使用错误处理程序模块处理错误,此解决方案是否会触发该中间件?@JMRBDev添加
next
并调用
next(错误)
create: async (req, res, next) => {
        const { body } = req;
        const passwordHash = await bcrypt.hash(body.password, 10);
        const user = new User({
            ...body,
            passwordHash,
        });
        try {
            const savedUser = await user.save();
            res.status(201).send(savedUser);
        }  catch (error) {
          console.log(error);
          next(error);
          // throw error; // you can throw error
          // res.status(422).send({ 'message': 'Validation error' }); // handle your error here
        }
    },