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

时间:2015-10-05 06:04:20

标签: javascript angularjs node.js express nodemailer

我有一个带有表单的角度应用程序,可以发出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
        });
    });
}

3 个答案:

答案 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对象导致它不会触发。把它放在外面让它变得很好,现在我没有错误。