如何在JavaScript中使用horseman后运行快速Web处理程序

时间:2017-11-01 02:45:39

标签: javascript express phantomjs

我试图抓一个网站,然后在我的网站上使用它。 但是,我自己的res.send和console.log总是在horseman收集数据之前触发。 我使用了回调但它似乎没有工作

var Horseman = require('node-horseman');
var express = require("express");

var app = express();

var URL = "SomeURL";

function getProf(callback){
    var result = {com:"default", rat:"default"};
    var horseman = new Horseman();
    horseman.open(URL)
        .evaluate(function(selector){
            var els = $(selector);
            $.each(els, function(i, el) {
                var event = document.createEvent('MouseEvent');
                event.initEvent('click', true, true);
                el.dispatchEvent(event);
            });
        }, 'h1:eq(3)')
        .delay(1000)
        .text('.metric')
        .then(function(text){
            result.com = text;   
        })
        .text('.expand-area>p')
        .then(function(text){
            result.rat = text;   
        })
        .close();
    callback(result.rat,result.com);
}

app.get("/",function(req,res){
    getProf(function(comments, rating){
        console.log(comments);
        console.log(rating);
        res.send('success');
    });
});

这给了我

default
default

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

由于horseman内容异步,您需要将callback移至.then方法的最后getProf

function getProf(callback){
    var result = {com:"default", rat:"default"};
    var horseman = new Horseman();
    horseman.open(URL)
        .evaluate(function(selector){
            var els = $(selector);
            $.each(els, function(i, el) {
                var event = document.createEvent('MouseEvent');
                event.initEvent('click', true, true);
                el.dispatchEvent(event);
            });
        }, 'h1:eq(3)')
        .delay(1000)
        .text('.metric')
        .then(function(text){
            result.com = text;   
        })
        .text('.expand-area>p')
        .then(function(text){
            result.rat = text;  
            callback(result.rat,result.com); 
        })
        .close();
}