【问题标题】:CORS Problem when using two express application使用两个快速应用程序时出现 CORS 问题
【发布时间】:2019-02-06 16:09:05
【问题描述】:

我正在尝试在 Windows Server 2012 上使用两个 Node.js express 服务器,每个服务器都有不同的 FQDN (example1.b.br | exemple2.b.br)。 应用程序是两个 Watson Chatbots,因此它们都需要使用 route /conversation 与 IBM 进行通信。

一个聊天机器人使用 443 端口,另一个使用 8443。

问题是:它们每个都在不同的目录中,并且有自己的名为“public”的子目录,但是当我执行两台服务器时,使用端口 8443 的服务器使用端口 443 服务器的“public”子目录。

  • 聊天机器人

    • 证书
    • 聊天机器人1

      • node_modules

      • 公开

      • CSS
      • 脚本
    • 聊天机器人2
      • node_modules
      • 公开
      • CSS
      • 脚本

Chatbot1 app.js:

const AssistantV1 = require('watson-developer-cloud/assistant/v1');
const express = require('express');
const bodyParser = require('body-parser');
const http = require('http');
const https = require('https');
var fs = require('fs');
var httpApp = express();

var workspace;

var options = {
  key: fs.readFileSync('certificates/key.pem'),
  cert: fs.readFileSync('certificates/server.crt')
};

const app = express();

app.use(bodyParser.json());
app.use(express.static('./public'));

const port = 80;
const httpsPort = 8443;

httpApp.set('port', process.env.PORT || 80);

const assistant = new AssistantV1({
  username: 'XXXXX',
  password: 'XXXXX',
  url: 'https://gateway.watsonplatform.net/assistant/api/',
  version: '2018-02-16'
});

  workspace = 'XXXXXXX';
  app.post('/conversation/', (req, res) => {
    const { text, context = {} } = req.body;
    const params = {
      input: { text },
      workspace_id: workspace,
      context,
    };

    assistant.message(params, (err, response) => {
      if (err) res.status(500).json(err);

      res.json(response);
    });
  });

try{
  //var httpServer = http.createServer(httpApp, app).listen(port);
  var httpsServer = https.createServer(options, app).listen(httpsPort); 
  //httpServer.listen(port, () => console.log(`Running on port ${port}`));
  httpsServer.listen(httpsPort, 'exemple1.b.br', () => console.log(`HTTPS Running on port ${httpsPort}`));  
  console.log(`---------------------------------`);
  console.log(`-----------ROBO INICIADO---------`);
  console.log(`---------------------------------`);
}catch(err){
  console.log(`*********************************`);
  console.log(`*****Falha ao iniciar o Robo*****`);
  console.log(`*********************************`);
  console.log(err);
} */

Chatbot2 app.js:

const AssistantV1 = require('watson-developer-cloud/assistant/v1');
const express = require('express');
const bodyParser = require('body-parser');
const http = require('http');
const https = require('https');
var fs = require('fs');
var httpApp = express();

var workspace;

var options = {
  key: fs.readFileSync('certificates/key.pem'),
  cert: fs.readFileSync('certificates/server.crt')
};

const app = express();

app.use(bodyParser.json());
app.use(express.static('./public'));

const port = 80;
const httpsPort = 443;

httpApp.set('port', process.env.PORT || 80);

const assistant = new AssistantV1({
  username: 'xxxxxxx',
  password: 'xxxxxx',
  url: 'https://gateway.watsonplatform.net/assistant/api/',
  version: '2018-02-16'
});

  workspace = 'XXXXXXX'
  app.post('/conversation/', (req, res) => {
    const { text, context = {} } = req.body;
    const params = {
      input: { text },
      workspace_id: workspace,
      context,
    };

    assistant.message(params, (err, response) => {
      if (err) res.status(500).json(err);

      res.json(response);
    });
  });


try{
  var httpsServer = https.createServer(options, app).listen(httpsPort); 
   httpsServer.listen(httpsPort, 'exemple2.b.br', () => console.log(`HTTPS Running on port ${httpsPort}`));  
  console.log(`---------------------------------`);
  console.log(`-----------ROBO INICIADO---------`);
  console.log(`---------------------------------`);
}catch(err){
  console.log(`*********************************`);
  console.log(`*****Falha ao iniciar o Robo*****`);
  console.log(`*********************************`);
}

如何“强制”服务器使用自己的子目录?

【问题讨论】:

  • app.use(express.static('./public')); 告诉两个应用使用同一个目录(当它们从同一个 cwd 启动时...
  • 如果我将 Chatbot2 的子目录名称更改为 'public2',Chatbot1 也会使用子目录 'public2'。
  • 你是如何启动这两个应用程序的?一个app 引用不会覆盖另一个吗?
  • 我用两个不同的 CMD 启动它们,作为不同的服务。抱歉,您是指 const 应用程序吗?如果是,他们不,我尝试使用不同的名称来搜索可能被覆盖的东西。我现在做了一个测试,如果我只使用端口 8443 运行聊天机器人,页面不会加载。 (但服务器一直在运行)

标签: javascript node.js express cors watson-conversation


【解决方案1】:

“问题”解决了。

实际上,我缺乏对 FQDN 实际工作原理的研究,并且有点责怪防病毒。

example2.b.br 的 url 不需要 ":443",因为端口是 HTTPS 的默认端口。 但是当我使用 example1.b.br 时,它需要在 (https://example1.b.br:8443) 之后使用 ":8443"。

至少这个简单的错误让我了解了这个细节。

之后,我发现服务器防病毒软件阻止了一些文件。在端口上创建异常只能通过内网通信后,问题得到解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-26
    • 2017-08-26
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多