我在客户端使用此处介绍的模式定义了一种流星方法https://guide.meteor.com/methods.html#advanced-boilerplate
// files.collection.js
import { Meteor } from 'meteor/meteor';
import { Mongo } from 'meteor/mongo';
import SimpleSchema from 'simpl-schema';
export const mediaFiles = new Mongo.Collection('media_files')
export const method_InsertFile = {
name: 'media_file.insert',
// Factor out validation so that it can be run independently (1)
validate(args) {
console.log('call validation: ', args)
new SimpleSchema({
title: { type: String },
filename: { type: String },
}).validate(args)
},
// Factor out Method body so that it can be called independently (3)
run({ filename, title }) {
let inserted_object = { title, filename }
mediaFiles.insert(inserted_object)
return inserted_object // object of interest
},
call(args, callback) {
console.log('call call method: ', args)
const options = {
returnStubValue: true, // (5)
throwStubExceptions: true // (6)
}
Meteor.apply(this.name, [args], options, callback);
}
};
if (Meteor.isServer) {
Meteor.methods({
// Actually register defined method with Meteor's DDP system
[method_InsertFile.name]: function (args) {
method_InsertFile.validate.call(this, args);
method_InsertFile.run.call(this, args);
},
});
}
该方法如下所示被调用
import { method_InsertFile } from '../api/files.collection';
method_InsertFile.call(data, (err, res) => {
if (err) console.log("Return err ", err)
else {
console.log('result: ', res)
}
})
我想在方法调用的末尾检索对象inserted_object
。我试图从这样的方法定义的call
块中返回一个Promise
return new Promise((resolve, reject) => {
Meteor.apply(this.name, [args], options, (err, res) => {
resolve(res)
});
})
但是result
返回undefined
。
任何关于这是否可能以及如何实现的指针都值得赞赏。
答案 0 :(得分:0)
在您的Meteor.methods
中声明的函数必须返回某些内容,以便将该结果作为结果传递给您的方法调用回调。
对于您而言,您只需返回run
调用的结果即可。
在方法调用中,您正确使用Meteor.apply
来执行与Meteor.methods
中声明的相同名称的函数,并将返回值用作回调的结果。