2017-12-29 8 views
0

私はUbuntuサーバー上でNode.JSで実行中の2つの違反ボット(app.jsとactivity.js)を持っています。私が直面している問題は、両方が動作しているときにactivity.jsだけがファイルを変更できることです。ファイルはusers.JSONです。 app.jsのコード:2つのNode.JSスクリプトが1つの.JSONファイルで読み書きできますが、最初のスクリプトはファイルを変更できません

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

、デュオは、メンバーの表です。 問題は、Activity.jsが実行されていないときに動作するため、App.jsのfs.writeFileであると結論付けました。 activity.jsが実行されているとき、「入力済み」は実際にapp.jsに記録されますが、ファイルは変更されません。また、+ =コマンドの上下の両方のコマンドは、変更されていますがusers.Jsonファイルには保存されていないことを示しています。どんな考えに責任があるのでしょうか? (私のskillz:Pを除く)

+0

O_NONBLOCKモードでfs.close()またはfsを試しましたか? – uglypointer

+0

私はそれを試み、あなたに知らせるでしょう!ありがとう! –

答えて

0

あなたのアプリデザインに問題があると思います。ファイルを2つのプロセスで絶対に共有することはできますが、常に並行性に問題があります。

これらの種類の場合、行/表をロックするデータベースを使用する必要があります。

+0

それは私がDBを使いたくない理由の小さなファイルです。しかし、もし私がこれを解決しないなら、私はそうするでしょう。とにかくありがとう:) –

+0

私はsqliteを使用し、コードが倍増してもうまくいきました。問題はアプリのデザインではなく、競争条件だった。同じファイルを使用する2つのスクリプトは競合状態になります。 –

関連する問題