Express后端上的fs.writeFile使得将来的客户端请求无法发送

时间:2019-08-27 12:04:51

标签: typescript express fetch

我正在编写一个将电子邮件文件(.eml)及其链接到的登录页面转换为可打印PDF的应用程序。通常可以,但是当我尝试在任何事情发生之前写入文件时,它就会中断。

(工作)过程如下:

  1. 客户端上传一些.eml文件,并将它们保存到uploads文件夹中
  2. 客户点击Generate PDF
  3. 这会将请求发送到服务器上的get-session-token,该请求:
    • a。生成一个随机的16个字符的令牌
    • b。使用该令牌作为名称创建一个新文件夹
    • c。将该令牌返回给客户端
  4. 然后,客户端开始遍历文件。对于每个文件:
    • a。它发送一个请求到process-email,并传递文件名和令牌,该请求包括:
      • 将电子邮件的html内容提取到3.b中生成的文件夹中(它使用客户端提供的令牌找到该文件夹​​)
      • 扫描html以查找到登录页面的链接
      • 将这些链接返回给客户端
    • b。如果process-email返回任何链接,则发送请求到process-page,并传递URL和令牌。此端点的详细信息与问题无关

到目前为止,所有这些方法都可以正常工作,但是我的问题是,当互联网中断(或公司服务器因提出过多请求而将我赶出去)时,所有进度都将丢失。所以我想我可以将进度保存在本地的json文件中,以后可以继续。

为此,我有一个projects.json文件,从理论上讲,该文件将包含有关您要构建的PDF的信息。

在服务器上运行get-session-token时,它将加载projects.json文件并添加会话令牌的条目。没别的了,因为这是坏处。

出于某种原因,当我这样做时,它会:

  • 仍然将令牌返回给浏览器
  • process-email的调用成功完成,返回的链接与以前相同
  • process-page的呼叫中断。我得到TypeError: Failed to fetch。尽管请求完全相同,但看起来请求甚至没有发出。

当我注释掉写到projects.json的行时,一切正常。当我取消注释时,它会破裂。

实际上,我什至没有尝试读取文件,而只是向其中写入一个空字符串。仍然会破坏它。

在发生其他任何事情之前,我还尝试过同步写入文件。还是一切。

这里有一些非常简单的代码,可以使一切成败:

export const generateProject = (cb: (err: any, token: string)=>void) => {
    const token = generateSessionToken();

    // Write fake data to the projects file
    fs.writeFileSync(path.join(__dirname, '../public/projects.json'), "{}");

    // Create folder with session token as name
    fs.mkdir(path.join(__dirname, '../public/gen/' + token), err => {
        if (err) {
            cb(err, null);
        } else {
            cb(null, token);
        }
    });
};

问题所在是writeFileSync。如果存在,则process-email有效,但process-page无效(它正在管理第一个请求,但不管理第二个请求?)。如果将该行注释掉,则一切正常。

我要疯了。

0 个答案:

没有答案