首页 > 解决方案 > 将 Mongoose 模式验证错误识别为 HTTP 状态代码

问题描述

我正在利用 Keystone.js 来提供轻量级的 CMS 和 API。我正在检查列表中的重复条目,如下所示:

Registration.schema.post('save', function(error, registration, next) {
  if (error && error.name === 'MongoError' && error.code === 11000) {
    error = Error(`409|${ registration['email'] } is already registered`);
  }

  next(error);
});

我正在从错误消息中解析状态代码以在我的 API 端点中返回。

是否有其他方法可以为 Keystone admin 中的重复项提供友好的错误消息,并能够为 API 调用返回正确的状态代码?

标签: keystonejs

解决方案


作为数据库版本 v3.6.9

$ mongod --version
db version v3.6.9
git version: 167861a164723168adfaaa866f310cb94010428f
OpenSSL version: OpenSSL 1.0.1t  3 May 2016
allocator: tcmalloc
modules: none
build environment:
    distmod: debian81
    distarch: x86_64
    target_arch: x86_64

我认为您应该检查ValidationError财产MongoError,如下所示:

RegistrationSchema.create(obj)
  .then(...)
  .catch(err => console.error('[registration] output: ', err);

我们假设email之前没有提到过来模拟is required错误。

你会看到这样的:

[registration] error:  { ValidationError: Registration validation failed: email: Path `email` is required.
at ValidationError.inspect (....)
errors: 
 {
   email:
     { Path `email` is required.
      ...
      message: 'Path `email` is required.',
        name: 'ValidatorError',
        properties: [Object],
        kind: 'required',
        path: 'email',
        value: [],
        reason: undefined,
        '$isValidatorError': true } },
  _message: 'Registration validation failed',
  name: 'ValidationError' }

推荐阅读