我暂时没有在Meteor中编码,但我有这个Meteor方法创建一个任务并返回ID,另一个将该任务附加到项目中:
Meteor.methods({
createTask(task) {
// TODO Add a check here to validate
Tasks.insert(task, (err, id) => {
if (err) {
throw new Meteor.Error(err);
}
id = {id: id};
console.log('Returning id: ', id);
return id;
});
}
});
Meteor.methods({
appendTaskToProject(projectId, taskId) {
// TODO Add check here to validate
const project = Projects.findOne({_id: projectId});
if (project) {
if (!project.tasks) {
project.tasks = [];
}
project.tasks.push(taskId);
Projects.update({_id: projectId}, project, (err, id) => {
if (err) {
throw new Meteor.Error(err);
}
});
} else {
throw new Error("Could not find project");
}
}
});
我试图像这样在客户端上调用它:
Meteor.call('createTask', task, (err, taskId) => {
console.log('err: ', err);
console.log('taskId: ', taskId);
if (err) {
this.setState({ error: err.message});
} else {
Meteor.call('appendTaskToProject', projectId, taskId, (err, result) => {
if (err) {
this.setState({ error: err.message});
} else {
this.setState({ newTaskDialogOpen: false })
}
});
}
});
我遇到的问题是回调中没有设置taskId
。从方法端我看到服务器中的日志消息,如:
I20180110-07:30:46.211(-5)? Returning id: { id: 'a3nS9GcRhuhhLiseb' }
在客户端:
Returning id: {id: "a3nS9GcRhuhhLiseb"}id:
Tasks.jsx:43 err: undefined
Tasks.jsx:44 taskId: undefined
所以我知道它已经归还了一些东西,但回调却没有得到它。我知道我应该将createTask更改为仅执行任务而projectId也将其链接起来,但我想尝试找出为什么它没有将Meteor方法的结果导入到客户端的回调中侧的。
答案 0 :(得分:1)
collection methods上的insert
上的Meteor API文档说明了以下内容:
在服务器上,如果您不提供回调,则插入块 直到数据库确认写入,否则抛出异常 有些不对劲。如果您确实提供了回调,请插入静止 立即返回ID。插件完成(或失败)后, 使用错误和结果参数调用回调。在错误的情况下, 结果未定义。如果插入成功,则错误未定义 结果是新文档ID。
将此信息应用于您的代码将创建以下内容:
Meteor.methods({
createTask(task) {
// TODO Add a check here to validate
return Tasks.insert(task, (err, id) => {
if (err) {
throw new Meteor.Error(err);
}
});
}
});
这会立即返回新生成的ID,但会有缺点,之后会抛出错误。因此,您最好直接进行并执行" sync-like":
Meteor.methods({
createTask(task) {
// TODO Add a check here to validate
return Tasks.insert(task);
}
});
meteor方法自动包装代码,以便在肯定的回报中,您的客户端将收到错误的null
值和结果的_id
值。如果在插入期间发生错误,该方法将自动将客户端回调中的错误作为错误返回,并且reuslt将为null。
如果您对代码的同步特性感到遗憾,请阅读this part of the guide有关方法的内容。
同样适用于您的更新方法:
Meteor.methods({
appendTaskToProject(projectId, taskId) {
// TODO Add check here to validate
return Projects.update({_id: projectId}, {$push: {tasks: taskId});
}
});
请注意,我将此方法概括为更加面向mongo的方法。
答案 1 :(得分:0)