【发布时间】:2014-08-10 16:57:44
【问题描述】:
我有以下代码,但我正在努力使用fs 将其保存到 csv。任何帮助表示赞赏。我一直在看this。
var request = require('request');
var cheerio = require('cheerio');
var wait = require("wait.for");
var fs = require('fs');
function requestWaitForWrapper(url, callback) {
request(url, function(error, response, html) {
if (error)
callback(error, response);
else if (response.statusCode == 200)
callback(null, html);
else
callback(new Error("Status not 200 OK"), response);
});
}
function readBookInfo(baseUrl, s) {
var html = wait.for(requestWaitForWrapper, baseUrl + '&s=' + s.toString());
var $ = cheerio.load(html, {
xmlMode: true
});
return {
s: s,
id: $('work').attr('id'),
total: parseInt($('records').attr('total'))
};
}
function readWorkInfo(id) {
var html = wait.for(requestWaitForWrapper, 'http://api.trove.nla.gov.au/work/' + id.toString() + '?key=6k6oagt6ott4ohno&reclevel=full');
var $ = cheerio.load(html, {
xmlMode: true
});
return {
title: $('title').text(),
contributor: $('contributor').text(),
description: $('abstract').text()
}
}
function main() {
var baseBookUrl = 'http://api.trove.nla.gov.au/result?key=6k6oagt6ott4ohno&zone=book&l-advformat=Thesis&sortby=dateDesc&q=+date%3A[2000+TO+2014]&l-availability=y&l-australian=y&n=1';
var baseInfo = readBookInfo(baseBookUrl, 0);
for (var s = 0; s < baseInfo.total; s++) {
var bookInfo = readBookInfo(baseBookUrl, s);
var workInfo = readWorkInfo(bookInfo.id);
fs.writeFile("Users/name/echojs.csv", bookInfo.id + ";" + workInfo.contributor + ";" + workInfo.description, function (err) {
if (err) throw err;
console.log('Save Complete');
});
}
}
wait.launchFiber(main);
评论后编辑
最后是不是这个意思:
for (var s = 0; s < baseInfo.total; s++) {
var bookInfo = readBookInfo(baseBookUrl, s);
var workInfo = readWorkInfo(bookInfo.id);
var combined = bookInfo.id+";"+workInfo.contributor+";"+workInfo.description;
fs.writeFile("Users/name/echojs.csv", combined, function (err) {
if (err) throw err;
console.log('Save Complete');
});
}
}
wait.launchFiber(main)
;
感谢您对我的包容 - node js 是我的。
【问题讨论】:
-
您遇到了哪些具体错误/问题?
-
你不能在这样的同步循环中调用
fs.writeFile。我建议您在写入之前编写一个存储所有数据的字符串,或者写入use streams。 -
使用
sync版本的函数应该可以消除您看到的异步问题,例如fs.appendFileSync,disasterjs.blogspot.cz/2013/03/… 上提供了一些澄清文章,此外,这个 npm 包 github.com/jprichardson/node-fs-extra 实现了一些sync文件系统功能,如创建目录等,您可能会发现这些功能很有用