Meteor.publish 调用异步函数返回错误

Meteor.publish with call to an async function returning error

我正在尝试为 Meteor.publish 创建一个包装方法,在实际调用它之前进行访问检查。

访问检查由 async-await 方法表示,如果我将包装方法转换为异步方法,运行 它会导致我的包装函数出现以下错误。

Exception from sub alerts.notAcknowledged id 2 Error: Publish function can only return a Cursor or an array of Cursors at Subscription._publishHandlerResult (packages/ddp-server/livedata_server.js:1132:18)

如果我从包装器方法中删除 async 关键字并注释掉对 async-await 方法的调用,包装器方法将按预期工作。

我没有找到解决我的问题的任何答案,但在检查了几个解决方案并尝试后,我得到了以下解决方案:

export const wrapperPublish = (metadata: any, callback: Function) => {
     Meteor.publish(metadata.name, (params: LooseObject) => {

        const allowAccessSync = Meteor.wrapAsync(allowAccess);
        const { error, hasAccess } = MeteorPromise.await(allowAccessSync({
                                     token: params.token,
                                     methodName: params.methodName,
                                     }, () => {}));
        check(params, metadata.checks);
        if (!hasAccess) {
            // do something 
        }

        return callback(params);
    });
};

在上面的代码片段中,allowAccess 表示返回 Promise 的函数,解决方案是 Meteor.wrapAsync 将异步函数转换为方便的同步函数。 https://docs.meteor.com/api/core.html#Meteor-wrapAsync