为什么save.js不能工作呢?麻烦大家看看吧,谢了哈
发布于 10 年前 作者 wangxuq 4404 次浏览 最后一次编辑是 8 年前

在学习爬虫程序,不知道为什么read.js可以工作,但是save.js不能工作,所爬的页面就是咱们这个cnodejs.org,想要的内容是话题的list,read.js是读取页面内容,save.js是保存到数据库中,目前数据库已经配置好,也经过测试,正常。运行work.js会出现下面的情况,那个save.js就是不能正常运行,请各位哥哥姐姐指教,谢谢了。。。 <pre><code> c:\node\lianxi\cnode\update>node work.js read is completely c:\node\lianxi\cnode\update> </pre></code>

reader.js如下: <pre><code> var request = require(‘request’); var cheerio = require(‘cheerio’); var debug = require(‘debug’)(‘cnode:update:read’); //读取帖子列表 exports.topicList = function(url,callback){ debug(‘get the topic list :%s’,url); request(url,function(err,res){ if(err){ return callback(err); } //根据网页内容创建DOM对象 var $ = cheerio.load(res.body.toString()); //读取topic列表 var topicList = []; $(’.topic_list .cell’).each(function(){ var $me = $(this); var $title = $me.find(‘topic_title_wrapper a’); var $time = $me.find(‘last_time last_active_time’); var item = { title : $title.text().trim(), url : $title.attr(‘href’), time : $time.text().trim() }; //从URL中提取出id var s = item.url.match(/([a-zA-Z0-9]+)/); if(Array.isArray(s)){ item.id = s[0]; topicList.push(item); } }); }); }; </pre></code> save.js如下: <pre><code> var async = require(‘async’); var db = require(’…/config’).db; var debug = require(‘debug’)(‘cnode:update:save’); //保存帖子列表 exports.topicList = function(list,callback){ debug(‘save the topic list :%s’,list.length); async.eachSeries(list,function(item,next){ //查询文章是否已经存在 db.query(‘select * from topic_list where id = ? limit 1’,[item.id],function(err,data){ if(err){ return next(err); } //将发布时间改成时间戳 var created_time = new Date(item.time).getTime()/1000; if(Array.isArray(data) && data.length > 0){ //分类已存在,更新一下 db.query(‘update topic_list set title = ?,url =?,created_time =? where id =?’,[item.title,item.url,created_time,item.id],next); }else{ //分类不存在,添加 db.query(‘insert into topic_list(id,title,url,created_time) values(?,?,?,?)’,[item.id,item.title,item.url,created_time],next); } }); },callback); }; </pre></code> work.js如下: <pre><code> var async = require(‘async’); var config = require(’…/config’); var read = require(’./read’); var save = require(’./save’); var debug = require(‘debug’)(‘cnode:update:all’); var topicList; async.series([ //获取帖子列表 function(done){ read.topicList(config.cnode.url,function(err,list){ if(err){ done(err); } topicList = list; }); console.log(‘read is completely’); }, //保存帖子列表到数据库中 function(done){ save.topicList(topicList,done); console.log(‘save is completely’); } ],function(err){ if(err){ console.log(err.stack); } console.log(‘completely’); process.exit(1); }); </pre></code>

4 回复

大家能帮忙看一下吗???

在你的async.series()中,每一步都没有调用done(null),所以就不会调用下一步的处理函数了。再仔细看看async的文档。

另外,像你要处理的这种流程,更适合调用async.waterfall()

@bnuhero 那使用async.eachSeries()应该可以吧

已经解决,是因为sql语句有一些问题,谢谢各位。

回到顶部