我有一个带有表单的角度应用程序,可以发出ajax请求。电子邮件工作正常,但不管我设置的回应是什么;我的路径出错了。我假设节点期望路径'/ send'呈现模板或数据,但我只想要路径发送电子邮件!〜我使用模式弹出窗口来表示&路径的角度ui路由。
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();
});
});
然而,即使电子邮件成功,我的错误处理程序也会获得404响应。
编辑:尝试了下面的两个解决方案,没有用。这是角度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('确实有错误'+错误);总是火..可能我需要发回数据吗?
这是我的快速代码中的错误处理程序:
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
});
});
}
答案 0 :(得分:1)
// 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',
}
在问题解释之上尝试此更改,我希望它能解决您的问题。 : - )
答案 1 :(得分:0)
以下是一些修正和评论:
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.
答案 2 :(得分:0)
transporter.sendMail(sendit,function(error, info){
if (error) {
console.log(error + "something strange...");
}
console.log("Message sent!");
});
res.send("Messaage was Sent");
return next();
});
这很有用。试图在transporter函数中设置res.send对象导致它不会触发。把它放在外面让它变得很好,现在我没有错误。