javascript - 当 node.js 部署到 Google App Engine 时,socket.io 连接失败

标签 javascript node.js google-app-engine socket.io

这是我可以在本地运行的代码片段:

服务器:

var app = require('express')();

app.use(function (req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
    res.setHeader('Access-Control-Allow-Credentials', true);

    next();
});


app.get('/', function (req, res) {
    console.log("Got '/'");
    res.status(200).send('Hello, world!');
});

var server = app.listen(process.env.PORT || '80', function () {
    console.log('App listening on port %s', server.address().port);
});

var io = require('socket.io')(server);

io.on('connection', function (socket) {
    console.log("connection");
});

客户端:(TypeScript,从不同端口上的单独应用程序运行,http://localhost:8080)

this.socket = io("http://localhost");       
this.socket.on("connect", () => this.onSocketConnect());

当服务器 si 部署在 Google App Engine 上时,客户端在本地运行,地址更改为 http://my-app-id.appspot.com 我收到以下错误:

与“ws://my-app-id.appspot.com/socket.io/?EIO=3&transport=websocket&sid=-Qr3YEeyZLk9K3zmAAAC”的 WebSocket 连接失败:WebSocket 握手期间出错:意外响应代码:400

这是什么原因造成的,我该如何解决?另外,一旦我开始运行,我打算更改为 https,有什么我需要注意的吗?

最佳答案

目前,不支持通过 wswss 协议(protocol)连接到 App Engine 应用程序。可以获取服务于初始请求的实例的 IP,然后直接连接到该实例,但这会绕过 App Engine 的负载均衡器,这首先会破坏将应用程序部署到 App Engine 的目的。

App Engine 公共(public)问题跟踪器上目前有一个 Unresolved 问题 ( Issue 2535: Web Sockets API )。欢迎star此问题以支持它并接收更新。

关于javascript - 当 node.js 部署到 Google App Engine 时,socket.io 连接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37962319/

相关文章:

javascript - IONIC 框架(AngularJs 和 JavaScript)|是否推荐基于 SOAP 的 Web 服务?

Javascript比较从对象属性中获取的数字作为字符串

javascript - 如何找到哪个键触发了表单提交事件

google-app-engine - 使用 App Engine 提供静态文件

javascript - 在 if 语句中检查多个数组元素

javascript - 在 Mongoose 中,找不到模块 '\node_modules\ipaddr.js\lib\ipaddr.js' 。请验证 package.json 是否具有有效的 "main"条目

python - 如何使用OCR提取指定位置的文本信息?

node.js - 用双引号替换 .toString() 单引号

google-app-engine - JPA 和应用引擎中的子实体身份(危机)

google-app-engine - 如何切换google app engine账号来部署应用?