node.js - 异步调用函数的NodeJs错误
问题描述
对不起我的英语,我希望有人能帮助我,我试图使用 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)
我的代码
服务器.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 ;
});
}
邮件.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,以便您可以初始化 express-mailer。
推荐阅读
- vmware - vCenter Server Appliance 上游不正常
- c++ - 双向链表。试图实现从源到目标的复制构造函数。假设目的地的长度为零(C++)
- php - Install redis extension for php 7.4 on Debian server
- html - Centering a button inside a table using css and bulma
- html - How to set background image to blob url
- rust - How do I use rocket_contrib::Uuid in a form?
- docusignapi - 带有多个文档/收件人但不同的反签名的 Docusign 信封
- database - MongoDb Realm HTTP API 连接
- javascript - Asp.net 500 内部服务器错误和 C# Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException
- extract - 如何提取 PCA 结果(仅 PC1 + PC2)并将其用作逻辑回归中的自变量?