首页 > 解决方案 > Meteor 服务器验证方法不会在客户端显示验证错误

问题描述

我有这个服务器端验证的方法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"

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

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

谢谢指教!

标签: meteormeteor-autoform

解决方案


两件事: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;
     }

  },
});


推荐阅读