Как отправлять запросы http (s) с Node.js на сервер Node.js, размещенный с LocalTunnel - PullRequest
0 голосов
/ 13 октября 2018

У меня есть очень простой сервер node.js:

var http = require("http");

var server = http.createServer(function(req, res){
    console.log("Got request");

    res.writeHead(200, {"Content-Type":"text/plain"});
    res.end("Hi there!");
});

server.listen(3004);

Я могу получить к нему доступ через свой браузер и отправив запрос от клиента Node.js:

var http = require("http");

var options = {
    "hostname": "localhost",
    "port": 3004,
    "path": "/",
    "method": "GET"
};

var req = http.request(options, function(res){
    var data = "";

    res.on("data", function(chunk){
        data += chunk;
    });

    res.on("end", function(){
        console.log(data);
    });
});

req.on("error", function(e){
    console.log(e.stack);
});

req.end();

Теперь, если я использую пакет localtunnel для «размещения» этого сервера (lt --port 3004), я теперь получаю новое имя хоста, к которому я должен иметь доступ к нему из Интернета.И действительно, я могу легко получить к нему доступ из браузера.

Однако, если я пытаюсь отправить запрос https (не http, потому что lt использует https) от клиента Node.js, с новым именем хоста, запрос отклоняется, и я получаю эту ошибку:

Ошибка: подключить ECONNREFUSED 138.197.63.247:3004 в TCPConnectWrap.afterConnect [as oncomplete]

Поэтому невозможно получить доступ к веб-серверу node.js, когда он размещенс местным туннелем?Или, если есть (может быть, с использованием модуля 3-ей части), может кто-нибудь, пожалуйста, подскажите мне, как это будет сделано, так как Google абсолютно бесполезен.Заранее спасибо.

EDIT1 : я должен отметить, что на стороне сервера сообщение об ошибке предлагает «проверить мой брандмауэр, но я понятия не имею, что в моем брандмауэре могло блокировать это, Я не уверен, что делать. (Помните, что это работает при подключении из браузера ??)

EDIT2 : Кстати, я попытался полностью удалить брандмауэр (получил тот же результат)

Ответы [ 3 ]

0 голосов
/ 21 октября 2018

Проблема в том, что вы не отправляете запрос с нужным портом.Когда вы используете сервис туннелирования, такой как localtunnel, он размещает ваш сервер как HTTPS.Теперь обычно для HTTPS используется порт 443, поэтому объект параметров должен выглядеть примерно так:

var options = {
    "hostname": "whatever",
    "port": 443,  //HERE!
    "path": "/",
    "method": "GET"
};

То же самое относится и к таким службам, как zeit или heroku, которые размещают ваше приложение из своего облака..

0 голосов
/ 25 октября 2018

Telebit - аналогичный сервис, хотя и с несколько иными целями, но я верю, что он поддержит ваш вариант использования.

HTTPS (tls / ssl) поддерживается посредством Greenlock.js и Let's Encrypt, поэтому вам не нужно изменять сервер узлов или настраивать что-либо вручную - сквозное шифрование обрабатывается автоматически.

Установка

curl https://get.telebit.io | bash

Вы также можете установить через npm ... но в настоящее время этот метод установки не является предпочтительным.Могут быть некоторые предупреждения.

Случайный домен, который вы получаете, привязан к вашей учетной записи (отсюда и необходимость в электронной почте).

Настройка

./telebit http 4000

Общий формат:

./telebit <protocol> <port> [subdomain]

Это не просто https, вы можете использовать его для туннелирования что угодно через tls / ssl (обычный tcp, ssh, openvpn и т. Д.).

Пользовательские доменыеще не являются общедоступной функцией, но они на горизонте.

0 голосов
/ 14 октября 2018

Вам необходимо использовать HTTPS модуль Node.js в коде сервера, чтобы иметь доступ к нему по протоколу HTTPS.Для создания HTTPS-сервера требуются сертификат и пароль.

Из документов:

const https = require('https');
const fs = require('fs');

const options = {
  pfx: fs.readFileSync('test/fixtures/test_cert.pfx'),
  passphrase: 'sample'
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end('hello world\n');
}).listen(8000);
...