#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()
, но ваша функция настройки не возвращает обещание, так что соглашение о вызове вообще не будет работать. Я понятия не имею, почему ОП принял этот ответ, потому что он не будет работать так, как предлагается.