简体   繁体   English

Nodejs Websockets 在本地工作但不在服务器上

[英]Nodejs Websockets work Locally but not on Server

I am attempting to use the express-ws library with a nodejs server being hosted on gcloud.我正在尝试将 express-ws 库与托管在 gcloud 上的 nodejs 服务器一起使用。 I'm using some basic starter code and it works when I run the code locally.我正在使用一些基本的入门代码,当我在本地运行代码时它可以工作。 However, if I try to connect when the code is being hosted on the web I receive an error.但是,如果我在代码托管在网络上时尝试连接,则会收到错误消息。 I am using a chrome extension to test the web sockets and it is able to access other echo servers.我正在使用 chrome 扩展来测试网络套接字,它能够访问其他回显服务器。 What is it about hosting the code in an app engine instance that is causing this issue?在导致此问题的应用引擎实例中托管代码是什么意思?

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');


var app = express();
var http = require('http');
app.server = http.createServer(app);
require('express-ws')(app, app.server);

app.ws('/echo', function(ws, req) {
  ws.on('message', function(msg) {
    ws.send(msg);
  });
});

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);


// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});


module.exports = app;

I have also modified /bin/www to be:我还修改了 /bin/www 为:

#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('eidalon-queue:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = app.server;

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);

These modifications were from this issue request where express-ws does not work with express-generator.这些修改来自此问题请求,其中 express-ws 不适用于 express-generator。

Websockets are only supported by Flexible Instances of App Engine and not Standard. Websockets 仅由 App Engine 的灵活实例支持,而不是标准实例 The standard environment just passes back an invalid response code to the handshake.标准环境只是向握手传递一个无效的响应代码。 Converting my project from standard to Flexible fixed the issue.将我的项目从标准转换为灵活解决了这个问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM