сегодня я наткнулся на большую проблему для одного из наших внутренних программных решений, и я никогда не был настолько отчаянным, чтобы открыть билет здесь раньше, но даже после консультации с другим коллегой нам не удалось понять,что не так.
Полагаю, это послужит хорошим уроком для кэшей Nginx, pm2 или Nodejs, которые могут быть интересны всем, кто разрабатывает с помощью этих приложений / рамок.
Факты:
Настройка
- Сервер Ubuntu 16.04
- развертывание на сервере через pm2 с компьютера Windows 10
- приложениянаписано в nodejs v8.9.4
История до фактической ошибки
- Приложение работало около полутора месяцев после первого развертываниябез проблем
- Сегодня приложение отображало ошибку: TypeError: путь должен быть строкой.Получено не определено
- Чтобы получить текущее состояние программы на компьютере, я приступил к обновлению приложения с помощью функции обновления pm2.
- Приложение снова работало после обновления,Во время развертывания npm установка выполняется снова, и я подумал, что это только что исправило проблему.
Фактическая ошибка
- В ходе дальнейшего тестирования яобнаружил, что одна из функций загрузки для Zip-файла больше не работает.
- После попытки / тестирования (с mocha) того же маршрута на моем локальном компьютере я пришел к решению, что с чем-то не такпуть к месту, где файл должен быть сохранен и извлечен из него.
- Тестирование для получения дополнительной регистрации из приложения не сработало.
- При входе на веб-страницу маршрута Nginx, pm2или приложение, кажется, предоставляет старую страницу до того, как я ее отредактировал.Хотя код на сервере определенно совпадает с кодом на моем компьютере.
- Cognito также не показывает / не использует новую страницу.
- Я действительно был уверен в этом факте послеразвертывание несколько раз с другими другими путями для сохранения файла zip, как вы можете видеть в примере.Он всегда пытается найти файл с этим путем: '/web/l18n/archive.zip'
- Даже если я указываю другой путь в файле маршрута, zip-файл всегда сохраняется в' / web/archive.zip'
Код
Не забывайте, что я уже много играл с кодом, чтобы устранить некоторые очевидные проблемы,Обе части запроса if, задающего путь к месту сохранения пути archive.zip, не влияют на Сообщение об ошибке
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
}