Тайм-аут соединения с конечной точкой Nodejs - PullRequest
0 голосов
/ 14 июня 2019

Я создал конечную точку в узле, которая при вызове с простой html-страницы отправляет электронное письмо.Все работает как положено, я могу нажать кнопку и отправить электронное письмо, однако, когда я выхожу за пределы локальной сети, все идет не так, как надо.

Я могу получить доступ ко всем страницам, используя сервер Apache, однако всякий раз, когда нажимаю кнопку электронной почты, я сталкиваюсь с ERR_CONNECTION_TIMED_OUT и не могу понять, почему.

Я настроил свой маршрутизатор для пересылки всего трафика, поступающего на порт 8080, на сервер apache и весь трафик, поступающий на порт 8081, на конечную точку /sendMail

Сервер, на котором размещенстраницы сидели за набором правил iptables, но с тех пор я установил для них пустой набор правил, но безрезультатно

Для справки:

mail.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-адрес в качестве внутреннего IP-адреса в clientside.js (как в закомментированной строке URL-адреса), я все еще сталкиваюсь с ошибкой тайм-аута

1 Ответ

0 голосов
/ 15 июня 2019

Вы получаете тайм-аут, потому что вы не отправляете ответ клиенту после того, как электронное письмо было успешным.поэтому клиент продолжает ждать ответа, пока не будет достигнут предел времени ожидания.

Попробуйте изменить эту строку:

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

на эту:

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

Также ID предлагает добавить res.status(500).json(error) в ваш обработчик ошибок

...