我有这段代码:
#!/usr/bin/env node
'use strict';
const request = require('superagent');
const querystring = require('querystring');
const path = require('path');
const fs = require('fs');
const timestamp = Math.floor(Date.now() / 1000).toString();
const logdir = path.join(__dirname, '../web/public/data/')
const logfile = path.join(logdir, timestamp + '.json');
// newsapi.org api key
const NEWSAPI_KEY = process.env.NEWSAPI_KEY;
// sources endpoint
const SOURCES = 'https://newsapi.org/v1/sources?language=en';
// articles endpoint
const ARTICLE_ENDPOINT = 'https://newsapi.org/v1/articles?';
function getLatest(src){
let sb = ['top','latest','popular'];
for (let i in sb){
let qs = querystring.stringify({source: src, sortBy: sb[i], apiKey: NEWSAPI_KEY});
request
.get(ARTICLE_ENDPOINT + qs)
.end((err, res) => {
if (!err){
fs.appendFile(logfile, JSON.stringify(res.body.articles), (err) => {
});
}
});
}
}
request
.get(SOURCES)
.end((err, res) => {
if (!err){
for ( var i in res.body.sources){
getLatest(res.body.sources[i].id);
}
}
});
此代码写入的文件最终看起来像这样
[{...},{...},{...}][{...},{...},{...}]...
这是无效的JSON。我如何确保它有效?
[{...},{...},{...},{...},{...},{...}]
我已经尝试了很多东西来使其工作,包括在事后将正则表达式应用于整个文件,将superagent包装在返回promise的函数中,并在依赖于代码中的事实之后编辑文件在这个脚本上运行。一切都无济于事。我知道必须有更好的(正确的)方法来做到这一点。
答案 0 :(得分:0)
使用正则表达式查找模式"] ["并用","
替换它答案 1 :(得分:0)
不是使用fs.appendFile
附加到文件,而是在循环之前创建一个数组,然后附加到该数组,然后将其序列化。
function getLatest(src){
let sb = ['top','latest','popular'];
let reqs = sb.length;
let allArticles = [];
for (let i in sb){
let qs = querystring.stringify({source: src, sortBy: sb[i], apiKey: NEWSAPI_KEY});
request
.get(ARTICLE_ENDPOINT + qs)
.end((err, res) => {
if (!err){
allArticles.push(res.body.articles);
}
else{
// error happend, decrement the number of requests needed for success.
reqs--;
}
// if the number of responses is as expected, write to the json all at once.
if(allArticles.length == reqs)
fs.writeFile(logfile, JSON.stringify(allArticles), (err) => {});
});
}
}
问题在于,您正在序列化单个数据,然后附加到文件而不是加入数据,在一个大的序列中然后写入文件。