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

Node.js调用search函数读取文件数据与预期不符问题咨询

问题原因
  • search函数内部的fetch是异步操作,函数本身没有返回对应的Promise,调用search('A')之后代码不会等待请求完成、文件写入完成,就直接执行了后续的readFileSync,此时大概率上一次写入的结果还没更新,读的是旧数据。
  • 两次调用search的API请求响应时间不固定,谁先返回谁就先写入文件,最终文件里的内容取决于哪个请求后完成,完全没有顺序保证,才会出现两次读取到的Title相同或者混乱的情况。
解决方案

第一步:修改client.js让search返回Promise

// client.js
const search = function(t) {
  // 返回fetch生成的Promise,供外部等待异步执行完成
  return fetch(`http://www.example.com/?t=${t}&apikey=${apiKey}`)
    .then(function (response) {
      return response.json();
    })
    .then(function(data){
      writeData(data)
      // 可选:直接返回响应数据,外部可直接使用无需读文件
      return data
    })
    .catch(function (err) {
      console.log('error: ' + err);
      throw err // 抛出错误供外部捕获处理
    });
}

function writeData(data) {
  let result = JSON.stringify(data);
  fs.writeFileSync('./filepath/resultData.json', result)
}

第二步:修改测试函数增加异步等待逻辑

// test.js
// 改为async异步函数,内部用await等待search执行完成
async function test1() {
  await search('A') 
  const rawData = fs.readFileSync('./filepath/resultData.json')
  const r = JSON.parse(rawData);
  console.log(r.Title)
}

async function test2() {
  await search('B') 
  const rawData = fs.readFileSync('./filepath/resultData.json')
  const r = JSON.parse(rawData);
  console.log(r.Title)
}

// 按顺序执行测试的调用方式,保证前一个测试完全结束再运行后一个
async function runTests() {
  await test1()
  await test2()
}
runTests()

额外优化建议

  • 如果不需要持久化存储测试结果,可以直接使用search返回的响应数据做断言,不需要经过文件读写步骤,彻底避免数据混淆。
  • 如果需要多个测试并行执行,可以给每个测试的写入文件分配独立的文件名,避免多个测试操作同一个文件产生覆盖冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 00:36:01