Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将函数从节点Horseman传递到'evaluate'函数?_Javascript_Node.js_Web Scraping_Web Crawler - Fatal编程技术网

Javascript 如何将函数从节点Horseman传递到'evaluate'函数?

Javascript 如何将函数从节点Horseman传递到'evaluate'函数?,javascript,node.js,web-scraping,web-crawler,Javascript,Node.js,Web Scraping,Web Crawler,使用Node Horseman,我们可以在节点内部使用PhantomJS。如果我们想在页面的上下文中执行一段JS代码,我们将执行以下操作: var Horseman = require('node-horseman'); var horseman = new Horseman(); horseman.open(pageUrl) .status() .evaluate(function () { // Js Code goes here

使用Node Horseman,我们可以在节点内部使用PhantomJS。如果我们想在页面的上下文中执行一段JS代码,我们将执行以下操作:

var Horseman = require('node-horseman');
var horseman = new Horseman();

horseman.open(pageUrl)
        .status()
        .evaluate(function () {
            // Js Code goes here
        })
        .close();
现在,假设我们想将“从外部”传递给求值函数。例如,如果我执行以下操作

var Horseman = require('node-horseman');
var horseman = new Horseman();

function someFunction() {}

horseman.open(pageUrl)
        .status()
        .evaluate(function () {
            someFunction();
        })
        .close();
var Horseman = require('node-horseman');
var url = require('url');
var horseman = new Horseman();

horseman.open(pageUrl)
        .status()
        .evaluate(function () {
            // try to use url somehow here
        })
        .close();
当我在evaluate中调用
someFunction
时,找不到它

另一个例子,假设我执行以下操作

var Horseman = require('node-horseman');
var horseman = new Horseman();

function someFunction() {}

horseman.open(pageUrl)
        .status()
        .evaluate(function () {
            someFunction();
        })
        .close();
var Horseman = require('node-horseman');
var url = require('url');
var horseman = new Horseman();

horseman.open(pageUrl)
        .status()
        .evaluate(function () {
            // try to use url somehow here
        })
        .close();

它也不能识别那里的
url
对象。我确实理解这个问题,代码是在页面的上下文中运行的。但是,是否有某种方法可以从外部传递这些内容,以便我们可以在evaluate内部使用它们?

您对页面上下文中运行的代码的看法是正确的。您可以将其视为打开浏览器控制台并将Evalue函数中的所有内容粘贴到那里

如果将someFunction()粘贴到控制台中,JS运行时将抛出一个错误:someFunction未定义。这是因为它从未在页面上下文中定义

实际上,有一种从外部传递函数的变通方法,但只有当函数不依赖于节点上下文中的其他函数和全局对象时,它才会起作用

以下是一个例子:

function someFunction() {
    return document.title;
}

horseman.open('http://google.com')
    .evaluate(function (someFunction) {
        eval('var sf = ' + someFunction);
        return sf();
    }, someFunction.toString())
    .log() //Will print out "Google"
    .close();
url实际上是一个node.js模块。您可以尝试将其替换为任何类似的客户端JS库,然后使用以下命令之一将其注入:

horseman
    .injectJs(file)

解决方法:

.evaluate(fn, [arg1, arg2,...])

这很模糊。请说明如何在问题代码中应用这一点。