当 运行 "pm2 start server --watch" 而不是 "pm2 start server" 时出现 CORS 错误。不存在 'Access-Control-Allow-Origin' header

CORS error when running "pm2 start server --watch" but not "pm2 start server". No 'Access-Control-Allow-Origin' header is present

编辑: post 中的所有内容仍然准确,但我刚刚注意到问题可能是 运行ning pm2 start server --watch 而不是 pm2 start server。这对我来说更没有意义。更新标题。

所以我有一个用 Node.js 编写的后端,作为一种 REST API 工作。我在一个用 Vue.js 编写的单独项目中有一个前端,它仅在 运行 本地(不托管在服务器上),用于发出请求并与我的远程托管节点交互。js/Express API.

我在我的 Vue.js 网页之一上使用 Axios 向我的 Node 后端发出 2 个请求。在后端,其中一个请求路由到我的在线数据库,一个请求路由到 Twilio 的 API。我遇到的问题是,当我通过 SSH 连接到我的服务器并使用简单的 node server 命令启动我的服务器时,页面加载正常并且两个请求的数据都为 returns。但是,当我使用 PM2 运行 服务器和 pm2 start server --watch 命令时, 只有网页上的两个请求之一会 return 数据 .另一个请求将抛出以下错误:

Access to XMLHttpRequest at 'https://*MYREMOTERESTAPI*' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

有时是 Mongo 请求 return 错误,而 Twilio return 是数据,有时是 Twilio 请求 return 是错误Mongo returns 数据时出错。 它是随机的,但我相信 Mongo 有利于它,因为它首先响应。

来自服务器的一些代码:

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

const cors = require('cors');

const fs = require('fs');
const morgan = require('morgan');
const winston = require('winston');
const path = require('path');

const bodyParser = require('body-parser');
const mongoose = require('mongoose');

app.use(cors());

mongoose.connect(MY SERVER INFO)

我什至使用以下代码(无效)向我的服务器添加了一个 .htaccess 文件:

Header always set Access-Control-Allow-Origin "http://localhost:8080"
Header always set Access-Control-Allow-Headers "Content-Type, Accept-Language, X-Access-Token, X-Client-Id, X-Secret-Id, X-GR-Token"
Header always set Access-Control-Allow-Methods "GET,POST,OPTIONS"
Header always set Access-Control-Expose-Headers "X-Access-Token, X-Refresh-Token,X-Access-Token-Expire, X-Pagination-Current-Page, X-Pagination-Page-Count,X-Pagination-Per-Page, X-Pagination-Total-Count, X-Payload"
Header always set Access-Control-Allow-Credentials "true"

在意识到问题与 pm2 的 "watch" 标志特别相关后(请参阅问题顶部的编辑),我能够缩小问题范围。每次向我的 RESTful API 发出请求时,它都会更新服务器上的日志文件。每次更新日志文件时,pm2 都会注意到文件更改并重新启动服务器,永远不会发送对第二个请求的响应。

我通过在服务器上与我的 server/app js 文件相同的目录中为 pm2 创建一个 ecosystem.config.js 文件并使用 "ignore_watch" 键指示 pm2 忽略来解决这个问题更改到我的日志文件夹。以下是该文件的内容:

module.exports = {
  apps : [{
    name: 'my-pm2-process-name',
    script: 'server.js',

    // Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/

    instances: 1,
    watch: true,
    ignore_watch: ["logs"],
    autorestart: true,
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'development'
    },
    env_production: {
      NODE_ENV: 'production'
    }
  }]
};

我遇到了同样的问题,其他答案的配置文件结构对我有帮助,但我还向 ignore_watch 添加了一些额外的文件夹,这对我很有用:

ignore_watch: [".git/index.lock", "logs", "public", "node_modules", "[\/\\]\./","pids", ".git", ".idea"],

我在通知观察者的数量方面也遇到了一些问题,这 article 帮助了我。

如果出现此问题,则每 ~60-90 秒重复一次并且没有文件被触发信号:

pm2 has been killed by signal, dumping process list before exit...

重新安装 pm2 对我也有帮助

pm2 kill 
sudo npm remove pm2 -g
    
sudo reboot
    
sudo npm install -g pm2