У меня есть базовая настройка веб-приложения с файловой структурой, похожей на эту:

WEB APP
 - data
   -year.txt

 - cron
   -write.js

Один родительский каталог с двумя папками, каждая из которых содержит один файл. Файл write.js генерирует кучу данных на серверной части, JSON.string формирует эти данные и записывает строку в файл year.txt, расположенный в другой папке. Вот как это выглядит в файле write.js:

try {
   fs.writeFile(__dirname + '/../data/year.txt', JSON.stringify(organizedData), () => {
      console.log('SUCCESS');
      res.status(200);
      res.send(null);
    });
} catch (e) {
      res.status(500);
      console.log(e);
      res.send(null);
}

Все это отлично работает на моем ЛОКАЛЬНОМ сервере, файл write.js обновляет year.txt правильными данными. Я просто пытаюсь понять, почему это не работает на моем рабочем сервере, размещенном в Google Cloud App Engine. Что меня действительно смущает, так это то, что когда я проверяю журналы на этом рабочем сервере, я получаю сообщение «УСПЕХ», что означает, что функция fs.writeFile не выдает никаких ошибок. Я проверяю URL-адрес файла year.txt, и ничего не добавляется. Я не могу понять это, возможно, это как-то связано с путем к файлу в функции writeFile?

0
awoldt 26 Янв 2022 в 16:26

2 ответа

fs.writeFile() передает свои ошибки обратному вызову в качестве первого аргумента err (на который вы не обращаете никакого внимания). Итак, первое, что вам нужно сделать, это зарегистрировать реальную ошибку fs.writeFile(). Но я бы «догадался», что это ошибка прав доступа к файлу для каталога, в который вы пытаетесь записать в конфигурации вашего хостинга.

fs.writeFile() не сообщает об ошибках, вызывая исключение. Итак, вам нужно отловить такие ошибки:

   fs.writeFile(__dirname + '/../data/year.txt', JSON.stringify(organizedData), (err) => {
      if (err) {
          console.log(err);
          res.sendStatus(500);
      } else {
          console.log('SUCCESS');
          res.sendStatus(200);
   });

возможно, это как-то связано с путем к файлу в функции writeFile

Да, возможно. Но регистрация фактической ошибки даст вам больше информации. Вы также можете прочитать некоторый документ по конфигурации вашего хостинга, чтобы узнать, куда именно вам разрешено писать из вашего серверного процесса.

Вот ссылка из документации Google Cloud. при записи данных в файлы. Он предлагает вам либо писать во временный каталог, либо писать в облачное хранилище Google.

2
jfriend00 26 Янв 2022 в 17:53
Ты прав. Он дает мне журнал EROFS на моем рабочем сервере. Спасибо за помощь!
 – 
awoldt
26 Янв 2022 в 17:18
1
– См. это обсуждение. Похоже, что для временного хранения файлов вы записываете в каталог временных файлов, а для длительного хранения вы записываете в облачное хранилище Google (через их API). А вот ссылка из документов Google.
 – 
jfriend00
26 Янв 2022 в 17:41

Это может быть связано с политикой чтения и записи файловой системы в вашей серверной среде, вам необходимо проверить, имеет ли ваше приложение node достаточно прав для записи файла в этот конкретный каталог.

Регистрация фактической ошибки даст вам и мне больше информации. Вам также необходимо прочитать некоторую документацию, чтобы узнать, куда именно вам разрешено писать из вашего серверного процесса.

0
hasanqqsp 26 Янв 2022 в 17:22