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
我正在尝试为 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