You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js异步函数如何正确返回数据?解决Jest测试报错问题

问题:Jest测试异步函数时出现日志延迟报错

我编写了如下异步函数:

async function example(){
let data = await another_function();
var ws = fs.createWriteStream('path');
let jsonData = [{'id':'1234', 'name': 'Alex'}];
    fastcsv
        .write(jsonData, { headers: true })
        .on("finish", function() {
            console.log('success');
        })
        .pipe(ws)
return true;
}

但使用Jest执行测试时出现报错:

Cannot log after tests are done. Did you forget to wait for something async in your test?
Attempted to log "success".

测试函数代码如下:

test('success', async() => {
        var expected = true;
        var result = await example();
        assert.equal(result, expected);
    })

请问如何修改example函数,使其能被正确await,直到返回true,解决Jest测试报错问题?


解决方案

问题核心是原函数里的fastcsv流写入是异步操作,但函数未等待该操作完成就直接返回true。Jest测试拿到返回值后就终止了,可此时流的finish事件还未触发,导致后续日志在测试结束后才输出,从而触发报错。

修改思路是将流操作包装为Promise,仅当流的finish事件触发时才resolve,确保await能等待整个写入流程完成。同时需监听error事件,避免Promise长期处于pending状态。

修改后的example函数:

async function example() {
  let data = await another_function();
  var ws = fs.createWriteStream('path');
  let jsonData = [{'id':'1234', 'name': 'Alex'}];

  return new Promise((resolve, reject) => {
    fastcsv
      .write(jsonData, { headers: true })
      .on("finish", function() {
          console.log('success');
          resolve(true);
      })
      .on("error", function(err) {
          reject(err);
      })
      .pipe(ws);

    // 监听写入流的错误,防止遗漏异常
    ws.on("error", function(err) {
      reject(err);
    });
  });
}

修改后,await example()会等待整个CSV写入操作完成(包括finish事件触发)才返回结果,Jest测试会等到操作结束后再终止,success日志能在测试结束前正常输出,不会再出现报错。

内容的提问来源于stack exchange,提问作者Bimbo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:18:28