【发布时间】:2022-01-07 13:07:20
【问题描述】:
我有一个客户端表单,可以在提交时创建一个文档。我想查看其中一个输入字段是否已经存在于数据库中的 Document 上。然后这会提醒用户并询问他们是否要继续创建记录。
客户端事件
Template.createDoc.events({
'click button[type=submit]'(e, template) {
//This particular example is checking to see if a Doc with its `name` property set to `value` already exists
const value = $('#name');
const fieldName = 'name';
const exists = Meteor.call('checkIfFieldExistsOnDoc', fieldName, value);
if (exists) {
if (confirm(`Doc with ${value} as its ${fieldName} already exists. Are you sure you want to continue creating Doc?`) {
//db.Docs.insert....
}
}
}
});
服务器端 Meteor 方法
'checkIfFieldExistsOnDoc'(field, val) {
if (this.isServer) {
this.unblock();
check(field, String);
check(val, String);
if (!this.userId) {
throw new Meteor.Error('not-authorized', 'You are not authorized.');
}
const findObj = {};
findObj[field] = val;
const fieldsObj = {};
fieldsObj[fieldsObj] = 1;
const doc = Docs.findOne(findObj, {fields: fieldsObj});
return doc;
}
},
我的问题是客户端代码在调用 Server 方法时总是未定义。但是,我现在明白了为什么我还不热衷于将所有后续客户端代码包装到回调中。
那么 - 关于如何尝试实现这个简单功能的任何其他想法?
另外 - 我正在考虑让客户端页面的 onCreated 执行 1 次服务器调用以获取所有 names 的所有 Docs,将其存储在内存中,然后在提交表单时进行检查使用这个。显然,这是低效且不可扩展的,尽管它可以工作
【问题讨论】: