运行“ pm2启动服务器--watch”而不是“ pm2启动服务器”时发生CORS错误。不存在“ Access-Control-Allow-Origin”标头

时间:2019-12-23 00:11:03

标签: javascript node.js axios pm2

编辑:这篇文章中的所有内容仍然正确,但我刚刚注意到,问题可能是在运行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.

有时,当Twilio返回数据时,是Mongo请求返回错误,有时,当Mongo返回数据时,是Twilio请求返回错误。 这是随机的,但我相信它会优先响应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"

2 个答案:

答案 0 :(得分:0)

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

我通过在服务器上与服务器/应用js文件位于同一服务器上的目录中为pm2创建ecology.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'
    }
  }]
};

答案 1 :(得分:0)

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

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

我的通知观察者数量也有一些问题,这个article帮助了我。

如果发生此问题,请每隔60-90秒重复一次,并且不会触发任何文件信号:

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

重新安装pm2也对我有帮助

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