【问题标题】:What is the correct way to await fs.readFile from another asynchronous function?从另一个异步函数等待 fs.readFile 的正确方法是什么?
【发布时间】:2020-11-06 05:39:15
【问题描述】:

我正在使用 Jest 和 Supertest 的组合来测试 API 端点。我正在使用 Jest 的 beforeAll() 函数在一组测试之前调用端点一次。在调用端点之前,我正在使用 fs.readFile 从文件中读取请求正文。

无论我尝试什么,我似乎都无法等待调用 fs.readFile 的函数的结果。我的请求每次都会导致 400 响应,因为没有等待函数 readRequestBody。似乎程序流程正在继续而不等待结果,因此发送了一个空的请求正文。

代码:

describe("Test POST call " + process.env.ENV, () => {
    const url = config.apiURL;
    let responseData: request.Response;

    beforeAll(async (done) => {
        const requestBody = await readRequestBody();
        responseData = await request(config.apiURL)
            .post("/v1.0/subjects/courses")
            .send(requestBody)
            .accept("application/vnd.api+json")
            .set("content-type", "application/vnd.api+json");
        done();
    });

    test("authorized should return 201 status code", () => {
        expect(responseData.status).toBe(201);
    });
});

async function readRequestBody() : Promise<string> {
    let requestBody: string = "";

    fs.readFile("./request.json", "utf8", (err, req) => {
        if (err) {
            console.log("Error loading request: " + err.message)
        }
        requestBody = req.replace("{{newCourseUuid}}", uuid.v4());
    });

    return requestBody;
}

我了解fs.readFile 异步读取文件的内容,但看起来我没有正确等待结果。我错过了什么?这是否与 beforeAll 本身是一个异步函数这一事实有关?

【问题讨论】:

  • 改用await fs.promises.readFile('file.txt')
  • 令人难以置信 - 工作愉快!谢谢! :) 如果您将此添加为答案,我会将其标记为正确。

标签: javascript typescript asynchronous jestjs supertest


【解决方案1】:

改用await fs.promises.readFile('file.txt') ?

https://nodejs.org/api/fs.html#fs_fs_promises_api

【讨论】:

    【解决方案2】:

    async functions 隐式地将它们的返回值转换为一个承诺。所以你的函数签名async function readRequestBody() : Promise&lt;string&gt; 意味着readRequestBody 将返回一个 Promise 来创建 Promise 来读取正文。即Promise&lt;Promise&lt;String&gt;&gt;。相反,您需要从返回值中删除 async 关键字或 Promise

    你的函数实现也不正确,因为fs.readFile 是一个异步函数,所以它总是返回一个空字符串。

    以下内容可能会解决您的两个问题:

    function readRequestBody() : Promise<string> {
        return new Promise((resolve, reject) => {
          fs.readFile("./request.json", "utf8", (err, req) => {
              if (err) {
                  console.log("Error loading request: " + err.message)
                  reject(err)
              }
              let requestBody: string = "";
              requestBody = req.replace("{{newCourseUuid}}", uuid.v4());
              resolve(requestBody)
          });      
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      • 1970-01-01
      • 2020-08-01
      • 2022-01-23
      • 2018-07-19
      相关资源
      最近更新 更多