fs.writeFile()
является асинхронным, и ваш код не ожидает его завершения перед обработкой следующего прокси. Как следствие, для каждого прокси-кода код считывает исходный файл в памяти, изменяет структуру данных (добавляет одну запись) и записывает ее обратно в файл. Последний вызов fs.writeFile()
, который завершает, решает содержимое файла.
Простое решение - использовать fs.readFileSync()
и fs.writeFileSync()
. Таким образом, асинхронная обработка не выполняется, для каждого прокси-кода код считывает фактическое содержимое файла и обновляет его перед обработкой следующего прокси.
Но это решение неэффективно! Нет смысла читать (и анализировать) содержимое файла снова, данные, используемые для записи файла, уже существуют в памяти.
Правильное решение - прочитать файл один раз, обновить данные в памяти для всех прокси затем запишите его обратно в файл.
Синхронная версия может выглядеть следующим образом:
const fs = require("fs")
let proxies = document.getElementById("proxies").value.split(/\r?\n/)
let filepath = "views/proxies.json";
function saveProxies(proxies, filepath) {
let data = fs.readFileSync(filepath)
let arr = JSON.parse(data)
proxies.forEach((proxy) => {
let pieces = proxy.split(':')
arr.push({
address: `${pieces[0]}:${pieces[1]}`,
username: pieces[2],
password: pieces[3]
})
})
fs.writeFileSync(filepath, JSON.stringify(arr))
}
Вы также должны обработать ошибки (файл не существует или он не читается / доступный для записи, его содержимое недействительно JSON et c).