Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 两个Node.JS脚本在单个.JSON文件上读/写,但第一个脚本无法修改该文件_Javascript_Json_Node.js_Discord_Discord.js - Fatal编程技术网

Javascript 两个Node.JS脚本在单个.JSON文件上读/写,但第一个脚本无法修改该文件

Javascript 两个Node.JS脚本在单个.JSON文件上读/写,但第一个脚本无法修改该文件,javascript,json,node.js,discord,discord.js,Javascript,Json,Node.js,Discord,Discord.js,我有两个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/u

我有两个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文件中。知道该怪什么吗?(除了我的技能之外)

我认为问题在于你的应用程序设计。您完全可以使用两个进程共享一个文件,但您总是会遇到并发问题


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

您是否尝试过使用fs.close()或带O_非块模式的fs?我将尝试并让您知道!谢谢这是一个小文件,这就是为什么我不想使用数据库。但如果我不解决这个问题,我会的。无论如何,谢谢:)我使用了sqlite,它工作得很好,尽管代码翻了一倍:P。问题是比赛条件,而不是应用程序设计。使用同一文件的两个脚本最终会产生竞争条件。