运行 "pm2 start server --watch" 但不"pm2 start server"时出现 CORS 错误。不存在'Access-Control-Allow-Origin'标头



edit:这篇文章中的所有内容仍然准确,但我刚刚注意到问题可能专门出现在运行pm2 start server --watch而不是pm2 start server时。 这对我来说更没有意义。 更新了标题。

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

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

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 请求返回错误,而 Twilio 返回数据,有时是 Twilio 请求返回错误,而 Mongo 返回数据。它是随机的,但我相信有利于 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的"监视"标志特别相关(请参阅问题顶部的编辑(后,我能够缩小问题范围。 每次向我的 RESTful API 发出请求时,它都会更新服务器上的日志文件。 每次更新日志文件时,pm2 都会注意到文件更改并重新启动服务器,永远不会对第二个请求发送响应。

我通过在服务器上与我的服务器/应用程序 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"],

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

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

PM2已被信号杀死,退出前转储进程列表...

重新安装pm2也帮助了我

pm2 kill 
sudo npm remove pm2 -g

sudo reboot

sudo npm install -g pm2

最新更新