异步调用函数的NodeJs错误

NodeJs error with asynchronous calling functions

抱歉我的英语不好,我希望有人能帮助我,我正在尝试使用 gmail 作为 smtp 发送模板电子邮件,在同一个文件 server.js 文件中一切正常,但我试图在不同的模块中分离我在调用同一函数时遇到错误,我在调试模式下遇到空错误

TypeError: Cannot read property 'then' of undefined
    at Object.exports.sendmail (/src/react/impex/jumbo-react-flat/mailing/server.js:44:4)
    at exports.sendregistermail (/src/react/impex/jumbo-react-flat/mailing/controllers/mailing.js:25:10)
    at Layer.handle [as handle_request] (/src/react/impex/jumbo-react-flat/mailing/node_modules/express/lib/router/layer.js:95:5)
    at next (/src/react/impex/jumbo-react-flat/mailing/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/src/react/impex/jumbo-react-flat/mailing/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/src/react/impex/jumbo-react-flat/mailing/node_modules/express/lib/router/layer.js:95:5)
    at /src/react/impex/jumbo-react-flat/mailing/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/src/react/impex/jumbo-react-flat/mailing/node_modules/express/lib/router/index.js:335:12)
    at next (/src/react/impex/jumbo-react-flat/mailing/node_modules/express/lib/router/index.js:275:10)
    at jsonParser (/src/react/impex/jumbo-react-flat/mailing/node_modules/body-parser/lib/types/json.js:109:7)

在控制台中我正在获取

/src/react/impex/jumbo-react-flat/mailing/node_modules/express-mailer/lib/express-mailer.js:81
          callback(null, res.message);
          ^

TypeError: callback is not a function
    at MailComposer.returnCallback (/src/react/impex/jumbo-react-flat/mailing/node_modules/express-mailer/lib/express-mailer.js:81:11)

我的代码

server.js

// call the packages we need
var express = require('express');  // call express
var bodyParser = require('body-parser');
path=require('path');
var app = express(); // create a server
var port = process.env.PORT || 8002;  // set our port
var mailer = require('express-mailer'); // call express
var promise = require('promise');


// set the view folder to views
app.set('views', __dirname + '/views');
// set the view engine to pug
app.set('view engine', 'pug');

app.use(bodyParser.json());

var routes = require('./routes/routes'); //importing route
routes(app); //register the route

// test route to trigger emails
// Configure express-mail and setup default mail data.
mailer.extend(app, {
  from: 'info@neptuno.ec',
  host: 'smtp.gmail.com', // hostname
  secureConnection: true, // use SSL
  port: 465, // port for secure SMTP
  transportMethod: 'SMTP', // default is SMTP. Accepts anything that nodemailer accepts
  auth: {
    user: 'user', // gmail id
    pass: 'pass' // gmail password
  }
});



app.listen(port, function () {
  console.log(`Escuchando en el puerto ${port}!`);
});

  // Send email.
  exports.sendmail = function (template, mailOptions) {
    app.mailer.send(template, mailOptions)
   .then(function (err) {
     debugger
      if (err) {
        return err;
      }
      return ;
    });
    }

mailing.js

var express = require('express');
var request = require('request');
var server = require('../server.js');
var Promise = require('promise');


exports.sendregistermail = function (req, res) {
res.header('Content-Type', 'application/json');
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type');

    // Setup email data.
    var mailOptions = {
      to: 'Polo@neptuno.ec',
      subject: 'Registro en Impex Flowers',
      user: { // data to view template
        name: 'Polo Onofa',
        thanks: 'Gracias por registrarte en impex FLowers',
        message: 'Un representante se comunicara contigo para completar tu registro'
      }
    }

    // Send email.

  server.sendmail('emailorden', mailOptions, function (err) {
    if (err) {
      console.log(err);
      res.send('Ocurrio un error al enviar tu email');
      return;
    }
    return res.send('Email enviado correctamente!');
  });


  };

非常感谢您的帮助

mailer.send() 返回的是回调而不是承诺,因此您不能在此处使用 .then()。您应该按如下方式更改函数:

exports.sendmail = function (template, mailOptions) {
    app.mailer.send(template, mailOptions, function (err) {
        if (err)
            return err;
        return ;
    });
}

关于重构代码的目标更为重要: 由于您正在创建一个用于发送邮件的模块,因此与邮件相关的所有内容都应该放在那里。 mailer.extend() 以及 sendmail() 应该移动到那里。确保将 app 的实例传递给 mailing.js,以便您可以初始化快递。