如何从流星方法调用中获取返回值?

时间:2019-03-20 00:35:41

标签: meteor

我在客户端使用此处介绍的模式定义了一种流星方法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

任何关于这是否可能以及如何实现的指针都值得赞赏。

1 个答案:

答案 0 :(得分:0)

在您的Meteor.methods中声明的函数必须返回某些内容,以便将该结果作为结果传递给您的方法调用回调。

对于您而言,您只需返回run调用的结果即可。

在方法调用中,您正确使用Meteor.apply来执行与Meteor.methods中声明的相同名称的函数,并将返回值用作回调的结果。