fs.writeFile 适用于本地主机但不适用于生产服务器

fs.writeFile works on localhost but not production server

我有一个基本的网络应用程序设置,其文件结构类似于:

WEB APP
 - data
   -year.txt

 - cron
   -write.js

一个父目录有两个文件夹,每个文件夹包含一个文件。 write.js 文件在后端生成一堆数据,JSON.stringifies 该数据并将字符串写入位于另一个文件夹中的 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 上。真正让我感到困惑的部分是,当我检查此生产服务器上的日志时,我收到“SUCCESS”消息,这意味着 fs.writeFile 函数没有抛出任何错误。我检查了 year.txt 文件 url 路径,但没有添加任何内容。我似乎无法弄清楚,这可能与 writeFile 函数中的文件路径有关吗?

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

does it maybe have something to do with the file path in the writeFile function

是的,可能吧。但记录实际错误将为您提供更多信息。您还可以阅读有关您的托管配置的一些文档,以找出您可以从服务器进程写入的确切位置。

这是 Google 云应用引擎文档中关于将数据写入文件的 reference。它建议您写入临时目录或写入 Google 云存储。

这可能与您服务器环境中的文件系统read-write策略有关,您需要验证您的节点应用程序是否有足够的权限在该特定目录中写入文件

记录实际错误将为您和我提供更多信息。你也是 需要阅读一些关于您的文档,以找出允许您从服务器进程写入的确切位置。