简体   繁体   中英

Using Meteor.wrapAsync correctly

Hopefully this is a newbie question. I have the following code that I am trying to convert to using meteor.wrapAsync. I am getting a "Exception while invoking method 'emailSend' ReferenceError: syncfunc is not defined" exception. What am i missing?

Stack Trace:

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);      
    }
  },  
})

You don't need to use external callback to sync methods as Meteor supports "async" and "awaits" by default. Below is an example of using 'await' method.

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

I believe Meteor.defer is more suited to what you're trying to achieve here.

Example:

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/

And if you're are going to be sending many emails, please take a look at mail-time. It can be of great help.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM