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