如何在Express端点中捕获mongoose ValidationError?

sr4lhrrt  于 2023-03-12  发布在  Go
关注(0)|答案(2)|浏览(112)

我正在尝试创建一个到MongoDB数据库的post请求。这个模式有一些必需的属性,我正在尝试处理来自缺少这些必需属性的请求的ValidationErrors。

const post_property = async (req, res) => {
    try {
        const ppty = new Properties(req.body);

        ppty.save();
        res.status(201).json({status: true, msg: "Property created", property: ppty});
    } catch (error) {
        if (error instanceof mongoose.Error.ValidationError) {
            res.status(400).json({status: false, msg: error.message});
        }

        res.status(500).json({status: false, msg: error.message});
    }
}

我的模式如下所示:

const PropertiesSchema = new mongoose.Schema(
    {
        name: { type: String, required: true },
        address: {
            street: { type: String, required: true },
            number_or_apt: { type: String, required: true },
            city: { type: String, required: true },
            state_province: { type: String, required: true },
            zip_code: { type: String, required: true },
            country: { type: String, required: true },
            latitude: { type: String, required: true },
            longitude: { type: String, required: true },
        },
        property_images: [ String ],
    }
);

const Properties = mongoose.model('properties', PropertiesSchema);

每当我发送缺少必需组件的请求时,节点服务器就会崩溃。我该如何处理这个错误?
我已经尝试实现中间件来处理这个错误,但是没有成功。

1cklez4t

1cklez4t1#

定义架构时,还可以定义错误消息以获得更好的方法
该模式如下所示:

name: { type: String, required: [true, 'Name is required.'],  },

当在没有name或任何字段为required的情况下调用create时,将在属性errors内抛出属性错误消息:

`"Event validation failed: name: Name is required."`

关于确认错误文档,处理错误的方法如下:

try {
  ...
} catch (error) {
  const errMsg = error.message ? error.message : error.errors.message
  //  use statuscode 400, because the error is about bad request.
  res.status(400).json({ status: false, msg: errMsg });
}```
cgfeq70w

cgfeq70w2#

我设法解决这个问题,使用承诺如下。

Properties.create(req.body)
    .then((ppty) => {
        ppty.save();
        res.status(201).json({status: true, msg: "Property created", property: ppty});
    })
    .catch((err) => {
        res.status(400).json({ status: false, msg: err });
    });

这将正确捕获验证错误。

相关问题