发送电子邮件时Node.js 404错误,忽略我的res.status

我有一个angular度的应用程序与forms,使Ajax请求。 电子邮件的工作正常,但不pipe我设定的回应; 我得到一个错误的path。 我假设节点期望path'/发送'来呈现一个模板或数据,但我只是想要电子邮件的path!〜我使用模式popup窗口&angular度ui路由的path。

app.get('/send', function (req, res, err) { var cartContent = req.body.slice(1,20); var content = tableify(cartContent); var sendit = { to: '*****@gmail.com', from: '****@bluenightphoto.com', replyTo: req.body[0].email, subject: "CP Carpet Quote Request: " + req.body[0].fname + " " + req.body[0].lname , // REQUIRED. html: '<b>Customer Quote</b>' + '<br>' + 'Customer Name: ' + req.body[0].fname + " " + '<br>' + 'Message: ' + req.body[0].message + '<br>' + <b>Table</b>'+ '<br><br>' + content, }; // Transporter refers to nodemailer and sendit is the login details(mail works fine!) transporter.sendMail(sendit, function (req, res, err) { if (err) { console.log(err + "something strange..."); res.status(401).send("that's all folk's"); } else { res.status(200).send("nuthing here"); console.log("Message sent! " ); } transporter.close(); }); }); 

然而,即使电子邮件成功,我的error handling程序始终会得到一个404响应。

编辑:尝试下面的两个解决scheme,没有工作。

这里是angular度的Ajax代码

 var makeForm = function () { if (mailJson[1].total !== 0) { deferred.resolve(mailJson); console.log('values loaded successfully again'); $http({ method : 'GET', url : '/send', data : mailJson, headers : { 'Content-type' : 'application/json' } }).success(function () { console.log('success!'); $scope.alertEmailOk = true; }).error(function (err) { console.log('there was an error indeed ' + err); $scope.alertEmailOk = false; }); } else { console.log('no values!'); deferred.reject(mailJson); } return deferred.promise; }; 

console.log('确实有错误'+ err); 总是火灾..也许我需要发回数据?

这是我的快速代码中的error handling程序:

 if (app.get('env') === 'production') { // changes it to use the optimized version for production app.use('/', express.static(path.join(__dirname, '/dist'))); // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); } 

 // Transporter refers to nodemailer and sendit is the login details(mail works fine!) 

我已经阅读了你的评论,但是首先让我们来看看下一部分:来自nodemailer

 var nodemailer = require('nodemailer'); var transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: 'sender@gmail.com', pass: 'password' } }); var sendIt = { //<------ i've just renamed this compare to nodemailer.com sample from: 'sender@address', to: 'receiver@address', subject: 'hello', text: 'hello world!' }; // this part is very important ! // note the signature. transporter.sendMail(sendIt, function(error, info){ if(error){ return console.log(error); } console.log('Message sent: ' + info.response); }); 

所以现在试图在你的代码中插入:

 //app.get('/send', function (req, res, err) { app.get('/send', function (req, res, next) { var cartContent = req.body.slice(1,20); var content = tableify(cartContent); var sendit = { to: '*****@gmail.com', from: '****@bluenightphoto.com', replyTo: req.body[0].email, subject: "CP Carpet Quote Request: " + req.body[0].fname + " " + req.body[0].lname , // REQUIRED. html: '<b>Customer Quote</b>' + '<br>' + 'Customer Name: ' + req.body[0].fname + " " + '<br>' + 'Message: ' + req.body[0].message + '<br>' + <b>Table</b>'+ '<br><br>' + content, }; // Transporter refers to nodemailer and sendit is the login details(mail works fine!) // | // | // v // Transporter refers to the login details and sendit to the mail options transporter.sendMail(sendit, function (error, info) {// instead of (req, res, err) { if (error) { // instead of err just to avoid colision name console.log(error + "something strange..."); res.status(401).send("that's all folk's"); } else { res.status(200).send("nuthing here"); console.log("Message sent! " ); } transporter.close(); }); return next(); }); 

在你的代码中,你的问题在这里:

 transporter.sendMail( sendit, function ( req, res, err) { //transporter.sendMail(sendit, function (error, info) { if (err) { console.log(err + "something strange..."); res.status(401).send("that's all folk's"); // you are acting here on the 'info' coming from transporter.sendMail // not on 'res' from app.get('/send', } else { res.status(200).send("nuthing here"); console.log("Message sent! " ); // you are acting here on the 'info' coming from transporter.sendMail // not on 'res' from app.get('/send', } 

试着在你的问题解释之上做这个改变,我希望它能解决你的问题。 🙂

这里有一些修复和评论:

 app.get('/send', function (req, res, next) { // ... transporter.sendMail(sendit, function (req, res, next) { // Asynchronous = do it later. // Parent arg `res` is masked by another `res` which is passed by `sendMail`. // I don't know if `sendMail` passes the same one or some other `res`. // You may try renaming it to `res2`. } return next(); // For now call next middleware, all async code will be executed later. 
 transporter.sendMail(sendit,function(error, info){ if (error) { console.log(error + "something strange..."); } console.log("Message sent!"); }); res.send("Messaage was Sent"); return next(); }); 

这工作。 尝试设置传输器函数内的res.send对象导致它不会触发。 把它放在外面让它很好,现在我没有任何错误。