簡體   English   中英

運行“pm2 start server --watch”而不是“pm2 start server”時出現 CORS 錯誤。 不存在“Access-Control-Allow-Origin”標頭

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

編輯:這篇文章中的所有內容仍然准確,但我剛剛注意到這個問題可能特別是在運行pm2 start server --watch而不是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 使用pm2 start server --watch命令運行服務器時,網頁上的兩個請求中只有一個會返回 data 另一個請求將拋出以下錯誤:

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 創建一個生態系統.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM