koa 进行爬虫。全局变量的值无法改变?

var router = require('koa-router')();
// 发起get请求
var request = require("request");
// 载入HTML
var cheerio = require('cheerio');

var _ = require('lodash')

var redis = require("redis"),
    client = redis.createClient();

    client.on("error", function (err) {
        console.log("Error " + err);
    });
// 最后返回的结果
var ret = [];

function reqst(key){
    client.get(key,(err,reply)=>{
        if(reply==null){
            request({
                method:"GET",
                url:encodeURI(`http://news.baidu.com/ns?cl=2&rn=20&tn=news&word=${key}`)
            },(err,res,body)=>{
                if(err){
                    console.log(err)
                }
                else if(!err&&res.statusCode==200){
                    let $ = cheerio.load(body);
                    
                    let res = Array.from($(".result")).splice(0,5);
                    
                    let tmp = [];
                    
                    for (var i = res.length - 1; i >= 0; i--) {
                        let cell = {
                            title:$(res[i]).find('.c-title').text(),    
                            author:$(res[i]).find('.c-author').text(),
                            summary:$(res[i]).find('.c-summary').text(),                            
                        }
                        tmp.unshift(cell);

                        ret.unshift(cell);
                    }
                    
                    client.set(key,JSON.stringify(tmp))
                }
            })
        }
        else{
            ret = ret.concat(JSON.parse(reply));
        }
    })//client get
    console.log(ret);
    return true;
}
router.get('/', async function (ctx, next) {        
    let keys = JSON.parse(ctx.query.key).split(',')
    let arr = [];
    _.each(keys,(key)=>{
        arr.push(reqst(key))
    })
    Promise.all(arr).then(res=>{
    },err=>{
        console.log(err);
    })
  
  ctx.state = {
    title: '搜索结果页面',
    ret:ret
  };    
  
  await ctx.render('results');
      ret  =[]
    }
)
module.exports = router;
阅读 4.2k
1 个回答

因为是异步,回调外面的变量先执行了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题