【问题标题】:Append to list for every proxy?附加到每个代理的列表?
【发布时间】:2020-04-23 17:33:54
【问题描述】:

对于此列表中的每个代理,我将其拆分并需要将其附加到文件中的数组中。

我已经尝试过了,但在 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) => {})
        })


    })
}

【问题讨论】:

  • 改用fs.appendFile
  • @Nuhman 文件的内容是 JSON。将任何内容附加到 JSON 会生成一个不是 JSON 的字符串。

标签: javascript json fs


【解决方案1】:

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 等)。

【讨论】:

    猜你喜欢
    • 2012-12-20
    • 2019-03-29
    • 2019-03-03
    • 2021-12-27
    • 2020-11-23
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    相关资源
    最近更新 更多