сделайте синхронизацию функций node.js

#javascript #node.js

Вопрос:

У меня проблема в том, что файл еще не существует до его считывания. В результате я продолжаю получать сообщение об ошибке no such File . Насколько мне известно fs.writeFileSync(); , это должно решить …?

функция в модуле:

 setup: function(server, RAM, client, message) {
    const dc = require("../libs/dcTools.js");
    const db = require('../libs/dbTools.js');
    const fs = require('fs');
    const channel = dc.getChannel(message, server.dashboard.channel);
    const dashboard = this.create(server, RAM, client);
    channel.send(dashboard).then(msg => {
      //that is the line ↓
fs.writeFileSync(`./RAM/${server.id}/dsbdmsgid.txt`, msg.id);
      console.log('done');
    });
//and this line produces the error ↓
    const msg = fs.readFileSync(`./RAM/${server.id}/dsbdmsgid.txt`, 'utf8');
    return msg;
  },
 

Функция, вызывающая функцию:

 execute(server, message) {
    const fs = require('fs');
    const db = require('../../libs/dbTools.js');
    const dashboard = require('../../modules/dashboard.js');
    if (args[0] == "setup") {
      server.dashboard.channel = message.channel.id;
//function ↓
    server.dashboard.msg = dashboard.setup(server, message);
      console.log('ready');
      server.dashboard.mod = true;
      db.updateServer(server);
    } else if (args[0] == "off") {
      server.dashboard.mod = false;
      db.updateServer(server);
    }
  }
 

Комментарии:

1. then Обработчик не запускается синхронно, поэтому setup async для исправления этого необходимо выполнить всю функцию целиком.

2. Почему вы пытаетесь записать файл, а затем прочитать его? Разве у вас уже нет данных, которые вы только что записали в файл?

Ответ №1:

Ваша setup функция должна быть асинхронной Внесите следующие изменения в объявление функции:

 setup: async function(server, RAM, client, message) {
    const dc = require("../libs/dcTools.js");
    const db = require('../libs/dbTools.js');
    const fs = require('fs');
    const channel = dc.getChannel(message, server.dashboard.channel);
    const dashboard = this.create(server, RAM, client);
    channel.send(dashboard).then(msg => {
      //that is the line ↓
    fs.writeFileSync(`./RAM/${server.id}/dsbdmsgid.txt`, msg.id);
      console.log('done');
    });
     //and this line produces the error ↓
    const msg = fs.readFileSync(`./RAM/${server.id}/dsbdmsgid.txt`, 'utf8');
    return msg;
  }
 

Теперь, чтобы вызвать эту функцию:

 dashboard.setup(server, message).then((msg) => {
    // Use the returned value of msg
})
 

Это должно сработать, но я рекомендую использовать fs.readFile вместо fs.readFileSync этого, так как это задержит цикл с одним потоком во время ввода-вывода, и другой процесс не может продолжаться, пока он не будет завершен.

Комментарии:

1. Если вы рекомендуете fs.readFile() и fs.writeFile() (что является правильным способом программирования сервера), то почему в вашем ответе не показано, как это сделать правильно?

2. Я хотел внести минимальные изменения, чтобы код работал, что он и сделает. Но моя рекомендация предназначена только для их рассмотрения, и я верю, что они смогут понять, как ее использовать.

3. Куда channel.send() делось то, что было в вопросе операциониста? Это кажется асинхронным и является источником исходной проблемы. Так что, похоже, вы на самом деле ничего не решили. Плюс вы говорите позвонить dashboard.setup(...).then() , но ваша функция настройки не возвращает обещание, так что соглашение о вызове вообще не будет работать. Я понятия не имею, почему ОП принял этот ответ, потому что он не будет работать так, как предлагается.