【问题标题】:Nodejs endpoint connection timeoutNodejs端点连接超时
【发布时间】:2019-06-14 00:51:37
【问题描述】:

我在节点中创建了一个端点,当从一个简单的 html 页面调用它时,它会发送一封电子邮件。一切都按预期工作,我可以单击按钮并发送电子邮件,但是当我离开本地网络时,事情就会出错。

我可以使用 apache 服务器访问所有页面,但是每当点击电子邮件按钮时,我都会遇到ERR_CONNECTION_TIMED_OUT,我似乎无法弄清楚原因。

我已将路由器设置为将所有进入端口 8080 的流量转发到 apache 服务器,并将所有进入端口 8081 的流量转发到端点/sendMail

托管页面的服务器位于一组 iptables 规则后面,但我已经将规则设置为空规则集,但无济于事

供参考,

ma​​il.js

let bodyParser = require('body-parser');
let multer = require('multer');
let cors = require('cors');
let url  = require('url');
let express = require('express');
let app = express();
let nodemailer = require('nodemailer');
let fs = require('fs');

app.use(cors());
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));
//app.use(multer());

/**
 *
 * Function to hopefully send an email :)
 */

app.post("/sendMail", function (req, res) {
    console.log("HERE");
    let transporter = nodemailer.createTransport({
       service: 'gmail',
        auth: {
            user: 'bodycentralprintingsite@gmail.com',
            pass: 'b0dyCenTral!'
        }
    });

    let mailOptions = {
        from: 'bodycentralprintingsite@gmail.com',
        to:   'justinbng36@gmail.com',
        subject: 'New Order ' + new Date(),
        text:    'Order recieved',
        attachments: [
            {
                path: req.body.image
            }
        ]
   };
   transporter.sendMail(mailOptions, function(error, info) {
        if (error) {
           console.log(error);
        } else {
            console.log('Email sent: ' + info.response);
        }
    });
});

app.listen(8081);

clientside.js

$('#Submit').click(function(){
    console.log("HERE");
    html2canvas(document.querySelector("#Submit")).then(canvas => {
        $.ajax({
        type: 'POST',
//        url: 'http://192.168.1.23:8080/sendMail',
        url: 'http://68.228.250.168:8081/sendMail',
        data: canvas ,
        contentType: "application/json; charset=utf-8",
        success: function(resultData) {console.log('done')}
        });
    });
});

编辑:托管网页的服务器还负责启动运行mail.js 的节点服务器。但是,当将 url 作为 clientside.js 中的内部 IP 时(如注释掉的 url 行中所示),我仍然面临超时错误

【问题讨论】:

  • 所有进入端口 8081 到端点 /sendMail 的流量:我不确定你如何将端口重定向到端点,因为它们都是一样的节点服务器,为什么不用8080?或者为什么在你的短语中区分路由器规则? (请告诉我您没有粘贴 真实 电子邮件地址,尤其是带有密码的那个...)
  • @StockOverflaw 不,他们是假邮件,我没那么粗心,你是说我应该说app.listen(8080)然后将clientside.js中的url更改为url: http://68.228.250.168:8080/sendMail
  • @StockOverflaw 也为了澄清,通过 ll 流量进入端口 8081 到端点 /sendMail 是我发送任何进入 68....:8081 -> @987654332 @如果这有道理?
  • 对于您的第一条评论:抱歉,根据您对问题的描述,我认为邮件节点与为您的 API 的其他路由提供服务的节点相同,显然不是。对于第二条评论:也许这就是问题所在,重定向到 /sendMail 而您已经在您的 URL 中定义了 /sendMail (或者规则没有发挥作用,因为您在 URL 中定义了 /sendMail)。尝试重定向68...:8081 > internal:8081,还是68...:8081/sendMail > internal:8081/sendMail?只是一个想法,因为我不知道路由器能够映射 URL:我只知道 IP/端口的映射。
  • @StockOverflaw 我不确定我是否理解您的第二条评论?我已经在重定向68...:8081 -> internal:8081,然后在查询时添加/sendMail。我还编辑了原始帖子,希望能更好地阐明这个场景,我很抱歉。

标签: html node.js apache nodemailer


【解决方案1】:

您正在超时,因为您在电子邮件成功后没有向客户发送响应。所以客户端一直等待响应,直到达到超时限制。

尝试改变这一行:

console.log('Email sent: ' + info.response);

到这里:

res.status(200).json(info.response)

我还建议在您的错误处理程序中添加res.status(500).json(error)

【讨论】:

    猜你喜欢
    • 2012-03-12
    • 2014-10-10
    • 2021-01-12
    • 2021-10-30
    • 2014-07-03
    • 2017-12-29
    • 2019-03-07
    • 2020-05-22
    • 1970-01-01
    相关资源
    最近更新 更多