我正在尝试制作一个抓取IMDB并列出电影名称和评级的网络抓取工具。这是我的index.js文件。 假设我正在爬行10部电影。然后我将抓取的结果保存在另一个文件中,例如'message.txt'。现在我想发送此message.txt文件作为对任何请求的响应。但每当我提出请求时,它总是最初向我发送一个空文件到我的浏览器。然后我注意到爬行结果保存在message.txt文件中需要一些时间。我认为这是因为所有动作在nodejs中都是异步的。那么有没有办法在爬行完成后发送message.txt文件?
let cell = UITableViewCell(style: .Subtitle, reuseIdentifier: "defaultCell")
答案 0 :(得分:0)
fs.appendFile('message.txt', JSON.stringify(json, null, 4) + '\n', function(err) {
//This part is executed after the process has been completed
});
您必须在那里进行回调,因为只有在您的操作执行后才会调用该部分。
我们正在使用这里的回调功能,虽然除了我们的错误之外没有任何具体的回调,但我们不需要任何其他的错误。
请尝试。
答案 1 :(得分:0)
fs.appendFile()
是异步的,因此当函数返回时,附加到文件的内容不会立即存在。因此,如果您想阅读将该文件发送给用户,则需要在您提供给fs.appendFile()
的回调中执行此操作。
app.get('/', function(req, res) {
...
fs.appendFile(
'message.txt',
JSON.stringify(json, null, 4) + '\n',
function(err) {
if (err) {
// Log the error and send a message to the user here
return;
}
res.sendFile(__dirname + '/index.js')
}
);
};
});
};
});
您可能想要使用fs.appendFileSync()
。对于命令行工具来说没问题,但由于这是一个Web服务器,所以不要这样做。它会在I / O发生时锁定线程。
答案 2 :(得分:0)
您可以使用非常适合控制流的异步包,例如:
console.log('Recieved the get Request');
var i = 1;
var count = 0;
while (count < 10) {
var url = 'http://www.imdb.com/title/tt' + i + '/';
console.log(url);
count = count + 1;
i = i + 1;
async.waterfall([
function sendRequest (callback) {
if (!error) {
var $ = cheero.load(html);
var json = {
title: '',
ratings: '',
released: ''
}
}
$('.title_wrapper').filter(function() {
var data = $(this);
json.title = data.children().first().text().trim();
json.released = data.children().last().children().last().text().trim();
});
$('.ratingValue').filter(function() {
var data = $(this);
json.ratings = parseFloat(data.text().trim());
});
callback(null, JSON.stringify(json, null, 4) + '\n');
},
function appendFile (json, callback) {
fs.appendFile('message.txt', json, function(err) {
if (err) { callback(err); }
callback();
});
}
], function(err) {
res.sendFile(__dirname + '/index.js');
});