【问题标题】:Two Node.JS scripts read/write on a single .JSON file but the first script cant modify the file两个 Node.JS 脚本在单个 .JSON 文件上读/写,但第一个脚本无法修改文件
【发布时间】:2018-06-09 12:54:34
【问题描述】:

我有两个 Discord 机器人(app.js 和 activity.js)在 Ubuntu 服务器上的 Node.JS 中运行。我面临的问题是,当它们都在运行时,只有 activity.js 能够修改文件。该文件是 users.JSON 。 app.js 代码:

const Discord = require("discord.js")
var moment = require("moment")
var data_users = fs.readFileSync('/home/discord/activity_bot/users.json', 'utf-8')
var arxeio = JSON.parse(data_users)
...
for (var i in duos) {
  if (arxeio[duos[i].username]) {
     console.log(`before: ` + arxeio[duos[i].username])
     arxeio[duos[i].username]+=15
     console.log(`after: ` + arxeio[duos[i].username])
  } else {
     arxeio[duos[i].username]=15
  }
}
fs.writeFile('/home/discord/activity_bot/users.json', JSON.stringify(arxeio, null, 2), 'utf-8', function(err) {
  if (err) throw err
  console.log('entered')
})

Activity.js 的代码是:

const Discord = require("discord.js");
var fs = require('fs');
var data = fs.readFileSync('/home/discord/activity_bot/users.json', 'utf-8')
var arxeio = JSON.parse(data)
...
var kuklos = setInterval(function(done) {
        client.guilds.get('323921290543235073').channels.forEach(function(kanali, kanaliID) {
          if (kanali.type === 'voice' && !kanali.name.includes("AFK")) {
            kanali.members.forEach(function(melos, melosID) {
              let xristis = melos.user.username;
              if (arxeio[xristis]) {
                arxeio[xristis]++;
              } else {
                arxeio[xristis] = 1
              }
              fs.writeFile('/home/discord/activity_bot/users.json', JSON.stringify(arxeio, null, 2), 'utf-8', function(err) {
                  if (err) throw err
              })
            })
          }
        })
      }, 60*1000);

其中,duos 是一个成员表。 我得出的结论是,问题出在 App.js 中的 fs.writeFile 上,因为当 activity.js 没有运行时它可以工作。当 activity.js 运行时,“entered”确实记录在 app.js 中,但文件没有被修改。 += 命令上方和下方的两个命令都显示它已修改但未保存在 users.Json 文件中。知道该怪什么吗? (除了我的技能:P)

【问题讨论】:

  • 您是否尝试过使用 fs.close() 或 fs 与 O_NONBLOCK 模式?
  • 我会尝试并告诉你!谢谢!

标签: javascript json node.js discord discord.js


【解决方案1】:

我认为问题出在您的应用设计中。您绝对可以与两个进程共享一个文件,但您总是会遇到并发问题。

对于这类事情,您必须使用锁定行/表的数据库。

【讨论】:

  • 这是一个小文件,这就是我不想使用数据库的原因。但如果我不解决这个问题,我会的。无论如何谢谢:)
  • 我使用了 sqlite,即使代码翻了一番,它也能正常工作:P。问题是竞争条件而不是应用程序设计。使用同一文件的两个脚本最终会出现竞争条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 2014-11-08
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 2022-07-27
相关资源
最近更新 更多