【问题标题】:Meteor server validated method doesn't display validation error on clientMeteor 服务器验证方法不会在客户端显示验证错误
【发布时间】:2019-09-08 21:49:00
【问题描述】:

我有这个服务器端验证方法imports/api/Shops/server/methods.js:

export const shopGeocodeAddress = new ValidatedMethod({
  name: 'shops.geocodeAddress',
  validate: new SimpleSchema({
    streetName: { type: String },
    houseNumber: { type: Number },
    city: { type: String },
    state: { type: String },
    country: { type: String },
    zip: { type: String, optional: true },
  }).validator(),
  run({ streetName, houseNumber, city, state, country, zip }) {
...
...
...
...
    return location;
  },
});

为了在客户端测试验证错误消息,我将 houseNumber 作为字符串发送,这将使方法失败,因为它期望 houseNumber 作为 Number。到目前为止,一切都很好。我在服务器控制台上收到这样的验证错误:

I20190418-10:55:28.605(-3)? Exception while invoking method 'shops.geocodeAddress' { ClientError: House number must be of type Number
...
...
I20190418-10:55:28.608(-3)?   errorType: 'ClientError',
I20190418-10:55:28.608(-3)?   name: 'ClientError',
I20190418-10:55:28.608(-3)?   error: 'validation-error',
I20190418-10:55:28.609(-3)?   details: 
I20190418-10:55:28.609(-3)?    [ { name: 'houseNumber',
I20190418-10:55:28.609(-3)?        value: NaN,
I20190418-10:55:28.609(-3)?        type: 'expectedType',
I20190418-10:55:28.609(-3)?        dataType: 'Number',
I20190418-10:55:28.609(-3)?        message: 'House number debe ser del tipo Number' } ] }

但在客户端我只收到这样的内部服务器错误:

details: undefined
error: 500
errorType: "Meteor.Error"
isClientSafe: true
message: "Internal server error [500]"
reason: "Internal server error"

因此,我无法指示客户端是哪种类型的错误,或者必须更改哪个字段才能使方法正确运行。

有没有办法捕获服务器方法上的验证错误并将它们发送到客户端?

感谢您的建议!

【问题讨论】:

    标签: meteor meteor-autoform


    【解决方案1】:

    最后我在 Meteor 论坛上使用了这个答案https://forums.meteor.com/t/server-validated-method-doesnt-display-validation-error-on-client/48635/2?u=razor7

    基本上我需要创建一个新文件以在服务器启动时运行以将验证错误路由到客户端

    import SimpleSchema from 'simpl-schema';
    
    SimpleSchema.defineValidationErrorTransform((error) => {
      const ddpError = new Meteor.Error(error.message);
      ddpError.error = 'validation-error';
      ddpError.details = error.details;
      ddpError.reason = error.message;
    
      return ddpError;
    });
    

    【讨论】:

      【解决方案2】:

      两件事: A) 你可以写

      city: String,
      state: String,
      zip: { type: String, optional: true }
      ...
      

      B)您说“服务器端验证方法”。您的方法需要位于服务器和客户端都可以访问的公共空间中。在该方法中,您将所有内容都包含在 Server 中。您从客户端调用该方法(并访问它)但在服务器上运行它:

      export const shopGeocodeAddress = new ValidatedMethod({
        name: 'shops.geocodeAddress',
        validate: new SimpleSchema({
          streetName: String,
          houseNumber: Number,
          city: String,
          state: String,
          country: String,
          zip: { type: String, optional: true },
        }).validator(),
        run({ streetName, houseNumber, city, state, country, zip }) {
           if (Meteor.isServer) {
            ...
            ...
            ...
            ...
          return location;
           }
      
        },
      });
      
      

      【讨论】:

        【解决方案3】:

        你可以把 s 包围起来 schema.validator 使用 try/catch 并抛出自定义的 Meteor.Error,其中包含更易于理解的信息。

        您可以对run 中的代码执行相同操作。

        如果您想对每个经过验证的方法都这样做,您可以创建一个简单的生成器函数:

        const createMethod = options => new ValidatedMethod({
          name: options.name,
          validate(...args) {
            try {
              new SimpleSchema(options.schema).validate(...args)
            } catch (e) {
              throw new Meteor.Error('validationError', e.reason)
            }
          },
          run(...args) {
            try {
              return options.run.call(this, ...args)
            } catch (e) {
              throw new Meteor.Error('methodError', e.reason)
            }    
          }
        })
        

        请注意,您可以使用e.reason || e.message

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-09-30
          • 1970-01-01
          • 2014-06-21
          • 2014-06-29
          • 2010-11-20
          • 2013-10-11
          • 2020-09-08
          相关资源
          最近更新 更多