首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过代理服务器运行NodeBB时出现的Websocket错误

通过代理服务器运行NodeBB时出现的Websocket错误
EN

Stack Overflow用户
提问于 2019-05-07 18:00:16
回答 1查看 350关注 0票数 0

我试图通过一个NodeBB反向代理(https://docs.nodebb.org/configuring/proxies/node/)运行node.js

我已经遵循了所有的教程,提示/提示,但我仍然在经历与我的NodeBB服务器的websocket连接的问题,导致会话问题,无法登录等等。

我的设置如下:

应用程序1 - http://www.mywebsite.co.uk/

  • Node.js & Express
  • API及前端网站的路由选择
  • 没有什么不寻常的
  • 文章底部的完整代码片段

我正在使用‘http-代理’npm模块来代理任何将http://mywebsite.co.uk/forum加载到http://www.myforum.co.uk/forum的人。

这部分正在正常工作,资产负荷如预期。然而,NodeBB有一部分使用websockets来轮询论坛的功能,即用户会话。这个部分没有正确地代理,或者至少NodeBB响应是不正确的,因此给了我很多错误:

“您正在以未知的来源访问论坛。这可能会导致websockets无法连接。要修复此问题,请将config.json中的config.json值设置为访问该站点的URL。有关详细信息,请参阅以下常见问题主题:https://community.nodebb.org/topic/13388

另外:

“看来您与NodeBB的连接丢失了,请稍候,我们将尝试重新连接。”

而且,在网络面板中,许多“挂起”的请求最终由于来自NodeBB的空响应而失败。

http://mywebsite.co.uk/forum/socket.io/?EIO=3&transport=polling&t=MgJQSMk

App 2 - http://www.myforum.co.uk/forum

这个应用程序是一个基本的NodeBB安装运行,有一个插件- (https://github.com/julianlam/nodebb-plugin-session-sharing)

配置JSON文件如下(注意,URL是我的前端应用程序的URL,如代理时的说明所示)。

代码语言:javascript
复制
{
    "url": "http://www.mywebsite.co.uk/forum",
    "secret": "secret",
    "database": "postgres",
    "port": "4567",
    "postgres": {
        "host": "HOST",
        "port": "PORT",
        "password": "PASSWORD",
        "database": "DATABASE"
    }
}

应用程序1代码:

代码语言:javascript
复制
// app
const express = require("express");
const app = express();

app.use(require('cookie-parser')());
app.use(require('body-parser').urlencoded({ extended: true }));
app.use(require('express-session')({ secret: 'secret', resave: true, saveUninitialized: true }));

//
app.use((req, res, next) => {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader(
    "Access-Control-Allow-Methods",
    "OPTIONS, GET, POST, PUT, PATCH, DELETE"
  );
  res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
  next();
});

// serve the content
app.use(express.static("dist"));

// Frontend
app.set('view engine', 'pug');

// serve out the api
// app.use ...

// Server set up
const httpProxy = require('http-proxy');
const HttpProxyRules = require('http-proxy-rules');

// Forum urls
let rules = {
  rules: {
    '/forum': 'http://www.myforum.co.uk/forum',
    '/forum/*': 'http://www.myforum.co.uk/forum',
  },
};

const proxyRules = new HttpProxyRules(rules);
const proxy = httpProxy.createProxy();

app.use(function (req, res, next) {
  try {
    if (req.url.includes("socket.io") === true) {
      // console.log("SOCKET.IO", req.url)
      return proxy.web(req, res, {
        target: 'wss://www.myforum.co.uk',
        ws: true,
        changeOrigin: true
      }, function (e) {
        // console.log('PROXY ERR', e)
        // next();
      });

    } else {
      var target = proxyRules.match(req);
      if (target) {
        // console.log("TARGET", target, req.url)
        return proxy.web(req, res, {
          target: target,
          changeOrigin: true
        }, function (e) {
          // console.log('PROXY ERR', e)
        });
      } else {
        next();
      }
    }
  } catch (e) {
    // res.sendStatus(500);
    res.json({ error: e });
  }
});

// Frontend routes
// app.use ...

// HTTP
const http = require('http');

// Create server
mainserver = http.createServer(app);

const PORT = process.env.PORT || 3000;
mainserver.listen(PORT);
mainserver.on('listening', onListening);
mainserver.on('error', function (error, req, res) {
  let json;
  console.log('proxy error', error);
  if (!res.headersSent) {
    res.writeHead(500, { 'content-type': 'application/json' });
  }

  json = { error: 'proxy_error', reason: error.message };
  res.end(JSON.stringify(json));
});

function onListening() {
  console.log(`Listening on :${PORT}`);
}

EN

回答 1

Stack Overflow用户

发布于 2019-06-11 08:56:27

为了解决这个问题,我更改了我使用的代理模块。它使用更少的代码来实现和使用websockets。我认为NodeBB Node.js代理文档已经过时,所以我将使用我找到的新方法进行更新。

工作守则如下:

代码语言:javascript
复制
/**
 * Proxy forum
 */
const proxy = require('http-proxy-middleware');

// Forum Proxy
app.use(
  '/forum',
  proxy({
    target: 'http://www.myforum.co.uk/forum',
    changeOrigin: true,
    ws: true,
  })
);

这里另一个潜在的问题是,这个Prixy设置需要在‘body-解析器’模块上面声明(如果它正在使用的话)。错误的订单会阻止邮件请求被代理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56028180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档