带有 Aldeed Autoform 的 MDG ValidatedMethod:“架构不允许使用 _id”错误
MDG ValidatedMethod with Aldeed Autoform: "_id is not allowed by the schema" error
我在尝试使用自动表单通过 ValidatedMethod 更新 collection 时收到错误“架构不允许使用 _id”。
据我所知 this example and the official docs 我的架构不希望包含 _id 字段,我也不希望从更新语句更新 id,所以我没有知道为什么会发生此错误。
如果我从使用经过验证的方法切换到直接写入 collection(带有附加到 collection 的模式,其中没有 id)一切都按预期工作,所以我假设问题出在我的 ValidatedMethod 中的验证。
知道我做错了什么吗?
模板:customer-edit.html
<template name="updateCustomerEdit">
{{> quickForm
collection="CustomerCompaniesGlobal"
doc=someDoc
id="updateCustomerEdit"
type="method-update"
meteormethod="CustomerCompanies.methods.update"
singleMethodArgument=true
}}
</template>
模板'code behind':customer-edit.js
Template.updateCustomerEdit.helpers({
someDoc() {
const customerId = () => FlowRouter.getParam('_id');
const instance = Template.instance();
instance.subscribe('CustomerCompany.get', customerId());
const company = CustomerCompanies.findOne({_id: customerId()});
return company;
}
});
更新验证方法:
// The update method
update = new ValidatedMethod({
// register the name
name: 'CustomerCompanies.methods.update',
// register a method for validation, what's going on here?
validate: new SimpleSchema({}).validator(),
// the actual database updating part validate has already been run at this point
run( newCustomer) {
console.log("method: update");
return CustomerCompanies.update(newCustomer);
}
});
架构:
Schemas = {};
Schemas.CustomerCompaniesSchema = new SimpleSchema({
name: {
type: String,
max: 100,
optional: false
},
email: {
type: String,
max: 100,
regEx: SimpleSchema.RegEx.Email,
optional: true
},
postcode: {
type: String,
max: 10,
optional: true
},
createdAt: {
type: Date,
optional: false
}
});
Collection:
class customerCompanyCollection extends Mongo.Collection {};
// Make it available to the rest of the app
CustomerCompanies = new customerCompanyCollection("Companies");
CustomerCompaniesGlobal = CustomerCompanies;
// Deny all client-side updates since we will be using methods to manage this collection
CustomerCompanies.deny({
insert() { return true; },
update() { return true; },
remove() { return true; }
});
// Define the expected Schema for data going into and coming out of the database
//CustomerCompanies.schema = Schemas.CustomerCompaniesSchema
// Bolt that schema onto the collection
CustomerCompanies.attachSchema(Schemas.CustomerCompaniesSchema);
我终于弄明白了。问题在于 autoform 传入一个复合对象,该对象表示要更改的记录的 id 以及数据的修饰符 ($set),而不仅仅是数据本身。所以该对象的结构是这样的:
_id: '5TTbSkfzawwuHGLhy',
modifier:
{
'$set':
{ name: 'Smiths Fabrication Ltd',
email: 'info@smithsfab.com',
postcode: 'OX10 4RT',
createdAt: Wed Jan 27 2016 00:00:00 GMT+0000 (GMT Standard Time)
}
}
弄明白后,我将更新方法更改为此,然后一切都按预期进行:
// Autoform specific update method that knows how to unpack the single
// object we get from autoform.
update = new ValidatedMethod({
// register the name
name: 'CustomerCompanies.methods.updateAutoForm',
// register a method for validation.
validate(autoformArgs) {
console.log(autoformArgs);
// Need to tell the schema that we are passing in a mongo modifier rather than just the data.
Schemas.CustomerCompaniesSchema.validate(autoformArgs.modifier , {modifier: true});
},
// the actual database updating part
// validate has already been run at this point
run(autoformArgs)
{
return CustomerCompanies.update(autoformArgs._id, autoformArgs.modifier);
}
});
非常好。当我努力寻找有关该主题的任何其他信息时,您的 post 帮助了我。
根据您的答案,如果出于某种原因您希望将表单数据作为单个块获取,您可以在 AutoForm 中使用以下内容。
type="method" meteormethod="myValidatedMethodName"
您经过验证的方法可能如下所示:
export const myValidatedMethodName = new ValidatedMethod({
name: 'Users.methods.create',
validate(insertDoc) {
Schemas.NewUser.validate(insertDoc);
},
run(insertDoc) {
return Collections.Users.createUser(insertDoc);
}
});
注意:Schema.validate() 方法需要一个对象,而不是像以前那样的修饰符。
我不清楚这两种方法总体上是否有任何明显的优势。
type="method-update" 显然是您想要更新文档的方式,因为您获得了修饰符。 type="method" 似乎是创建新文档的最佳方式。在您不打算从表单数据创建文档的大多数情况下,它也可能是最佳选择。
我在尝试使用自动表单通过 ValidatedMethod 更新 collection 时收到错误“架构不允许使用 _id”。
据我所知 this example and the official docs 我的架构不希望包含 _id 字段,我也不希望从更新语句更新 id,所以我没有知道为什么会发生此错误。
如果我从使用经过验证的方法切换到直接写入 collection(带有附加到 collection 的模式,其中没有 id)一切都按预期工作,所以我假设问题出在我的 ValidatedMethod 中的验证。
知道我做错了什么吗?
模板:customer-edit.html
<template name="updateCustomerEdit">
{{> quickForm
collection="CustomerCompaniesGlobal"
doc=someDoc
id="updateCustomerEdit"
type="method-update"
meteormethod="CustomerCompanies.methods.update"
singleMethodArgument=true
}}
</template>
模板'code behind':customer-edit.js
Template.updateCustomerEdit.helpers({
someDoc() {
const customerId = () => FlowRouter.getParam('_id');
const instance = Template.instance();
instance.subscribe('CustomerCompany.get', customerId());
const company = CustomerCompanies.findOne({_id: customerId()});
return company;
}
});
更新验证方法:
// The update method
update = new ValidatedMethod({
// register the name
name: 'CustomerCompanies.methods.update',
// register a method for validation, what's going on here?
validate: new SimpleSchema({}).validator(),
// the actual database updating part validate has already been run at this point
run( newCustomer) {
console.log("method: update");
return CustomerCompanies.update(newCustomer);
}
});
架构:
Schemas = {};
Schemas.CustomerCompaniesSchema = new SimpleSchema({
name: {
type: String,
max: 100,
optional: false
},
email: {
type: String,
max: 100,
regEx: SimpleSchema.RegEx.Email,
optional: true
},
postcode: {
type: String,
max: 10,
optional: true
},
createdAt: {
type: Date,
optional: false
}
});
Collection:
class customerCompanyCollection extends Mongo.Collection {};
// Make it available to the rest of the app
CustomerCompanies = new customerCompanyCollection("Companies");
CustomerCompaniesGlobal = CustomerCompanies;
// Deny all client-side updates since we will be using methods to manage this collection
CustomerCompanies.deny({
insert() { return true; },
update() { return true; },
remove() { return true; }
});
// Define the expected Schema for data going into and coming out of the database
//CustomerCompanies.schema = Schemas.CustomerCompaniesSchema
// Bolt that schema onto the collection
CustomerCompanies.attachSchema(Schemas.CustomerCompaniesSchema);
我终于弄明白了。问题在于 autoform 传入一个复合对象,该对象表示要更改的记录的 id 以及数据的修饰符 ($set),而不仅仅是数据本身。所以该对象的结构是这样的:
_id: '5TTbSkfzawwuHGLhy',
modifier:
{
'$set':
{ name: 'Smiths Fabrication Ltd',
email: 'info@smithsfab.com',
postcode: 'OX10 4RT',
createdAt: Wed Jan 27 2016 00:00:00 GMT+0000 (GMT Standard Time)
}
}
弄明白后,我将更新方法更改为此,然后一切都按预期进行:
// Autoform specific update method that knows how to unpack the single
// object we get from autoform.
update = new ValidatedMethod({
// register the name
name: 'CustomerCompanies.methods.updateAutoForm',
// register a method for validation.
validate(autoformArgs) {
console.log(autoformArgs);
// Need to tell the schema that we are passing in a mongo modifier rather than just the data.
Schemas.CustomerCompaniesSchema.validate(autoformArgs.modifier , {modifier: true});
},
// the actual database updating part
// validate has already been run at this point
run(autoformArgs)
{
return CustomerCompanies.update(autoformArgs._id, autoformArgs.modifier);
}
});
非常好。当我努力寻找有关该主题的任何其他信息时,您的 post 帮助了我。
根据您的答案,如果出于某种原因您希望将表单数据作为单个块获取,您可以在 AutoForm 中使用以下内容。
type="method" meteormethod="myValidatedMethodName"
您经过验证的方法可能如下所示:
export const myValidatedMethodName = new ValidatedMethod({
name: 'Users.methods.create',
validate(insertDoc) {
Schemas.NewUser.validate(insertDoc);
},
run(insertDoc) {
return Collections.Users.createUser(insertDoc);
}
});
注意:Schema.validate() 方法需要一个对象,而不是像以前那样的修饰符。
我不清楚这两种方法总体上是否有任何明显的优势。
type="method-update" 显然是您想要更新文档的方式,因为您获得了修饰符。 type="method" 似乎是创建新文档的最佳方式。在您不打算从表单数据创建文档的大多数情况下,它也可能是最佳选择。