【问题标题】:Using Meteor.wrapAsync correctly正确使用 Meteor.wrapAsync
【发布时间】:2019-12-02 17:51:31
【问题描述】:

希望这是一个新手问题。 我有以下代码,我正在尝试使用meteor.wrapAsync 转换为。我收到“调用方法'emailSend'ReferenceError 时出现异常:未定义syncfunc”异常。我错过了什么?

堆栈跟踪:

I20191031-06:21:16.246(-5)? Exception while invoking method 'emailSend' ReferenceError: syncfunc is not defined
I20191031-06:21:16.248(-5)?     at MethodInvocation.emailSend (src/imports/api/email.js:13:27)
I20191031-06:21:16.249(-5)?     at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1771:12)
I20191031-06:21:16.273(-5)?     at DDP._CurrentMethodInvocation.withValue (packages/ddp-server/livedata_server.js:719:19)  
I20191031-06:21:16.275(-5)?     at Meteor.EnvironmentVariable.EVp.withValue (packages\meteor.js:1234:12)
I20191031-06:21:16.276(-5)?     at DDPServer._CurrentWriteFence.withValue (packages/ddp-server/livedata_server.js:717:46)  
I20191031-06:21:16.277(-5)?     at Meteor.EnvironmentVariable.EVp.withValue (packages\meteor.js:1234:12)
I20191031-06:21:16.277(-5)?     at Promise (packages/ddp-server/livedata_server.js:715:46)
I20191031-06:21:16.278(-5)?     at new Promise (<anonymous>)
I20191031-06:21:16.279(-5)?     at Session.method (packages/ddp-server/livedata_server.js:689:23)
I20191031-06:21:16.280(-5)?     at packages/ddp-server/livedata_server.js:559:43

email.js:

Meteor.methods(
{
  emailSend(fromAddress, subject, emailText) 
  {
    if (Meteor.isServer) 
    {     
      const { Email } = require('../server/email.js');
      var syncFunc = Meteor.wrapAsync(Email.send); 
      var sendEmailReturn=syncfunc(fromAddress, subject, emailText);      
      return sendEmailReturn;
      **//if I comment out the above three lines and uncomment the line below then the application works fine.** 
      //return Email.send(fromAddress, subject, emailText);      
    }
  },  
})

【问题讨论】:

  • Email.send 已经是同步的,所以不需要使用 Meteor.wrapAsync。
  • 这是一个错字。请使用适当的 IDE 并通读内容。 (syncFunc -> syncfunc)。 JavaScript 区分大小写
  • 谢谢@AluanHaddad,发帖前我需要喝咖啡。

标签: javascript node.js meteor


【解决方案1】:

你不需要使用外部回调来同步方法,因为 Meteor 默认支持“async”和“await”。下面是一个使用 'await' 方法的例子。

Meteor.methods({
    async emailSend(fromAddress, subject, emailText) {
        const { Email } = require('../server/email.js');
        var sendEmailReturn = await Email.send(fromAddress, subject, emailText);
    }
});

【讨论】:

    【解决方案2】:

    我相信Meteor.defer 更适合您在这里想要实现的目标。

    例子:

    Meteor.methods({
        'action_plus_email': function () {
            // do something
    
            Meteor.defer(() => {
                Email.send(...)
            })
    
            return 'hello there, user';
        }
    })
    

    https://www.meteor-tuts.com/chapters/1/meteorsnacks#Meteor-defer

    https://apiko.com/blog/organization-of-email-sending-in-meteorjs/

    如果您要发送许多电子邮件,请查看邮件时间。这会很有帮助。

    https://github.com/VeliovGroup/Mail-Time

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 2016-03-28
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多