我有一个非常基本的节点.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();
现在,如果我使用本地隧道包来"托管"此服务器(lt --port 3004
(,我现在获得我的新主机名,我应该能够从互联网上访问它。事实上,我可以轻松地从浏览器访问它。
但是,如果我尝试使用新主机名从 Node.js 客户端发送 https(不是 http,因为lt
使用 https(请求,该请求将被拒绝,并且我收到此错误:
错误:连接 ECONNREJECT 138.197.63.247:3004 at TCPConnectWrap.afterConnect [as oncomplete]
那么,当节点.js Web服务器托管在本地隧道时,是否无法访问该服务器?或者如果有(也许使用第 3 部分模块(,有人可以指导我如何做到这一点,因为谷歌绝对没有帮助。提前谢谢。
编辑1:我应该注意,在服务器端,错误消息确实建议"检查我的防火墙,但我不知道我的防火墙中有什么可能会阻止它,我不确定该怎么办。 (还记得从浏览器连接时这有效吗??
编辑2:顺便说一句,我试图完全删除我的防火墙(得到相同的结果(
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等(来隧道传输任何内容。
自定义域尚未成为正式发布的功能,但它们即将出现。
你需要在服务器代码中使用 Node.js 的 HTTPS 模块才能通过 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 worldn');
}).listen(8000);
问题是您没有使用正确的端口发送请求。当您使用本地隧道等隧道服务时,它会将您的服务器托管为 HTTPS。现在通常用于HTTPS的端口是端口443,所以选项对象应该看起来像这样:
var options = {
"hostname": "whatever",
"port": 443, //HERE!
"path": "/",
"method": "GET"
};
对于从云托管应用程序的zeit
或heroku
等服务也是如此。