2015-10-05 56 views
2

我有一个角度的应用程序与表单,使ajax请求。电子邮件工作正常,但不管我设定的回应是什么;我得到了一条路径错误。我假设节点期望路径'/ send'来呈现模板或数据,但我只想要电子邮件的路径!〜我使用模式弹出式窗口&角度ui路由选择路径。发送电子邮件时Node.js 404错误,忽略我的res.status

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( '有一个错误确实' + ERR);总是火灾..可能需要发回数据?

这里是我的快件代码中的错误处理程序:

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

通过异步获得了一些信息,但我确信我们在这里丢失了一小段代码。该路由控制器中的其他任何东西?另外,中间件是'(req,res,next)' –

+0

它与'angularjs'有关吗?如果它超出了等式 - 然后删除标签以避免饥饿的'angularjs'大脑。 – ilyaigpetrov

+0

我添加了角度ajax代码。 – deek

回答

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(); 
}); 

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

+0

现在你有问题了吗?或者一切都像你想要的那样工作? – Anonymous0day

+0

没问题,它解决了100%..我很惊讶我可以让res.send在运输车内工作。 – deek

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. 
+0

试过,没有工作 – deek

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: '[email protected]', 
     pass: 'password' 
    } 
}); 
var sendIt = { //<------ i've just renamed this compare to nodemailer.com sample 
    from: '[email protected]', 
    to: '[email protected]', 
    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',  

    } 

试试你的问题解释上述这种变化,我希望这将解决你的问题。 :-)

+0

没有工作,我添加了我的错误处理程序和ajax角码到原来的问题。 – deek

+0

如果你用'return next();'代替'return next();'会发生什么?' – Anonymous0day

+0

我给了你赏金,你的回答让我朝着正确的方向 – deek