node搭建本地服务器,接受post请求,返回爬虫爬取的数据,log上都显示成功,但是前端接到的数据是catch中的数据。

发布于 2022-09-06 16:03:49 字数 2457 浏览 14 评论 0

用node搭建了一个本地服务器,主要的功能是,接受Post请求,然后去sf上面爬数据返回,显示的情况是,在cmd里面打印出来,显示的是爬取成功,但是前台接到的确实catch中的error2。
下面是代码。

图片描述

图片描述

图片描述

let http = require("http");
let url = require("url"); //解析get请求
let query = require("querystring"); //post请求相关
// let creep = require('./creep');

http.createServer(function(request,response){
    //post
    response.setHeader("Access-Control-Allow-Origin","*");
    response.setHeader(
          "Access-Control-Allow-Methods",
          "PUT, GET, POST, DELETE, HEAD, PATCH"
    );

    // var params = url.parse(request.url,true);

    let postData = "";
    request.addListener("data",function(chunk){
        postData += chunk;
    });

    //end 表示全部body接受完毕
    request.addListener("end",function(){
        creepDataForUrl().then(function(creepRes){
            response.end(creepRes);
        },function(e){
            console.log("fail");
        }).catch(function(e){
            console.log("error:" +JSON.stringify(e));
        })        
    });
}).listen(8011);

const https = require('https');
const cheerio = require('cheerio');

function creepDataForUrl(){
    return new Promise(function(resolve,rej){
        https.get('https://segmentfault.com', (res) => {
                  var data = '';
                  res.on('data', (chunk) => {
                    data += chunk;
                  });
                  res.on('end', () => {
                      let temp = getDataFromHtml(data);
                      console.log(temp.length);
                      resolve(temp);
                  })
            }).on('error', (e) => {
                  console.log("这里出错了:" + JSON.stringify(e));
                  rej && rej(e);
            });
    });
}

function getDataFromHtml(htmlData){
    let $ = cheerio.load(htmlData);
    let items = $("div.news-item.stream__item.clearfix");
    let resAry=[];
    items.each(function(index,item){
        let el = $(item);
        resAry.push({
            title:el.find(".news__item-info a").first().text(),
        });
    });
    return resAry;
}




如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

等待圉鍢 2022-09-13 16:03:49

ok,问题我找到了,在确实在catch里捕获了一个错误,使用JSON.stringify是看不到内容的(这个我不知道为什么,有可能js的error对象里面的属性是不可枚举的?),我直接打印e.message,得到的提示是:first argument must be a string or buffer. 我在success里面第一个参数时数组,所以才会进入catch,改成.tostring之后就可以了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文