今天,我偶然发现了一个内部软件解决方案的大问题,而且我从来没有想过要在这里开张罚单,但是即使在咨询了另一位同事之后,我们也无法弄清楚找出问题所在。
我想这将是关于Nginx,pm2或Nodejs缓存的一个很好的教训,对于那些正在使用这些Applications / Framework开发的人来说,这可能很有趣。
设置
实际错误之前的故事
实际错误
代码
别忘了我已经使用很多代码来解决一些明显的问题。 if请求的两个部分都将存档.zip路径保存到的路径都对Error Message
无效。
var zip = new JSZip()
const dictionaryName = process.env.dictionaryNames
const splitDictionaryName = dictionaryName.split(';')
for (const dictionary of splitDictionaryName) {
const tempDictionaryPath = path.join(__dirname, '/../../' + process.env.dictionaryFolder + '/dictionary.' + dictionary + '.json')
const dictionaryContent = fs.readFileSync(tempDictionaryPath, 'utf8')
zip.file('dictionary.' + dictionary + '.json', dictionaryContent)
}
await zip.generateAsync({
type: 'nodebuffer'
})
.then(async function (content) {
const stateString = process.env.state | 'local'
let archivePath = ''
if (stateString === 'staging') {
archivePath = '/web/l18n/current/afasfsagf.zip'
} else {
archivePath = path.join(__dirname, '/../aasdasfgasfgs.zip')
}
await fs.writeFile(archivePath, content, function (err) {
if (err) {
global.log.info(err)
res.send({})
} else {
res.download(archivePath)
}
})
}).catch(function (err) {
global.log.err(err)
})
路由
正在通过上面提供的文件直接加载路线。每隔一条路径,甚至是更高级的文件处理路径都可以正常工作。
const downloadAll = require('./routes/downloadAll.js')
this.http = express()
this.http.get('/download_all', downloadAll)
车把“请求”
正在访问的是通过新窗口的路线,当在主本地路线上按下按钮时会打开该窗口。
$('button').click(function (event) {
let buttonId = $(this).attr('id')
if (buttonId === 'downloadAllDictionaries') {
var win = window.open('/download_all')
window.location.reload()
}
})
Nginx
server {
listen 80;
server_name ****;
access_log /var/log/nginx/****.access.log;
error_log /var/log/nginx/****.error.log;
# pass the request to the node.js server with the correct headers
# and much more can be added, see nginx config options
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:7000;
proxy_set_header Host **********;
proxy_redirect off;
}
listen 443 ssl; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
if ($scheme != "https") {
return 301 https://$host$request_uri;
} # managed by Certbot
}
答案 0 :(得分:0)
确保nginx没有缓存代理请求。
将这2行添加到代理位置:
location / {
add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
expires off;
}
答案 1 :(得分:0)
我有这个问题。 我的nodeJS应用程序修改未激活。 许多人认为这是Nginx或浏览器的缓存,但实际上是PM2将所有JS文件加载到内存中,并提供了不错的加速功能,但是当PM2的标准安装文件发生更改时,它不会更新。 / p>
这是解决方法:https://pm2.keymetrics.io/docs/usage/watch-and-restart/
因此,代替使用来启动您的应用程序
pm2启动MyApp.js
做
pm2启动MyApp.js --watch
在开发阶段,您可以避免这种神秘的缓存现象。