Добавить в список для каждого прокси? - PullRequest
0 голосов
/ 06 января 2020

Для каждого прокси, который у меня есть в этом списке, я разделяю его и мне нужно добавить его в массив в файле.

Я пробовал это, но из 5 добавляется только один прокси:

function saveProxies() {
    const fs = require("fs")

    let proxies = document.getElementById("proxies").value.split(/\r?\n/)

    // for(i = 0; i < proxies.length; i++) {
    //     await doo(proxies[i])
    // }

    proxies.forEach(proxy => {
        // doo(proxy)
        let p1 = `${proxy.split(":")[0]}:${proxy.split(":")[1]}`
        let p2 = proxy.split(":")[2]
        let p3 = proxy.split(":")[3]

        fs.readFile("views/proxies.json", (err, data) => {
            let arr = JSON.parse(data)

            arr.push({
                address: p1,
                username: p2,
                password: p3
            })

            fs.writeFile("views/proxies.json", JSON.stringify(arr), (err) => {})
        })


    })
}

1 Ответ

1 голос
/ 06 января 2020

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).

...