如何将Node.js中console.log的输出保存为格式正确的JSON文件
解决方案
- 核心问题1:
google-play-scraper的app方法返回的是异步Promise对象,原代码中fs.writeFile会在接口返回数据之前提前执行,无法获取到要保存的目标数据 - 核心问题2:原逻辑仅将接口返回的数据传给
console.log打印,没有把数据传递给文件写入逻辑使用 - 之前使用
$node filename.js > test.json生成的JSON格式不符合规范,是因为控制台输出可能包含除JSON外的其他日志内容,直接重定向写入会污染JSON结构,用代码写入可完全规避该问题
修改后可运行的完整代码
var gplay = require('google-play-scraper'); const fs = require('fs') gplay.app({appId: 'com.sablostudio.printing3d.town.builder', country: 'us'}).then(data => { // 拿到接口返回数据后执行写入操作 fs.writeFile('./newconstomer.json', JSON.stringify(data, null, 2), err => { if (err) { console.log(err); } else { console.log("file done"); } }) }).catch(err => { // 补充错误捕获,方便排查接口请求异常 console.log('接口请求失败:', err) })
关键修改说明
- 移除冗余的
def函数封装,直接在Promise的then回调中处理返回的接口数据 - 将文件写入逻辑移动到
then回调内部,保证只有拿到接口返回的data之后才会执行写入操作 - 补充Promise的
catch错误捕获,便于排查接口请求阶段的异常 JSON.stringify第一个参数直接传入接口返回的data,就是你之前打印到控制台的目标内容
内容的提问来源于stack exchange,提问作者Muhammad Ayub
相关产品推荐
相关产品推荐

