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
相关产品推荐
相关产品推荐

