【问题标题】:ReferenceError: Can't find variable with SpookyJSReferenceError:无法使用 SpookyJS 找到变量
【发布时间】:2015-03-17 19:52:09
【问题描述】:

我尝试在 SpookyJS 中通过与 wiki 中相同的方式调用外部函数:https://github.com/WaterfallEngineering/SpookyJS/wiki/Introduction

但是当我尝试下面的代码时,我有这个错误:

ReferenceError:找不到变量:测试

try {
    var Spooky = require('spooky');
} catch (e) {
    var Spooky = require('../lib/spooky');
}

var urls = ["http://www.google.fr",
            "http://www.yahoo.com"
          ];

exports.clicker = function(req, res)
{
  console.log("FIRST: " + visitUrl + " \n\n\n END FIRST");


  var visitUrl = function(urlIndex, nbClicked)
  {
      console.log("HELLO");
  };

  var spooky = new Spooky(
    {
      child: {
        // transport: 'http'
      },
      casper: {
        logLevel: 'debug',
        verbose: true
      }
    }, function (err)
    {
      if (err)
      {
        e = new Error('Failed to initialize SpookyJS');
        e.details = err;
        throw e;
      }

      spooky.start(urls[0]);

      console.log("SECOND: " + visitUrl + " \n\n\n END SECOND");

      spooky.then([{
        test: visitUrl
      }, function(){

        console.log("THIRD: " + test + " \n\n\n END THIRD");
      }]);

      spooky.run();
    });

    // Uncomment this block to see all of the things Casper has to say.
    // There are a lot.
    // He has opinions.
    spooky.on('console', function (line) {
      console.log(line);
    });

    spooky.on('hello', function (greeting) {
      console.log(greeting);
    });

    spooky.on('log', function (log) {
      if (log.space === 'remote') {
        console.log(log.message.replace(/ \- .*/, ''));
      }
    });
}

以下两个日志有效:

console.log("FIRST: " + visitUrl + " \n\n\n END FIRST");
console.log("SECOND: " + visitUrl + " \n\n\n END SECOND");

但是第三个负责错误信息:

console.log("THIRD: " + test + " \n\n\n END THIRD");

有什么建议吗?

【问题讨论】:

    标签: javascript node.js phantomjs casperjs spookyjs


    【解决方案1】:

    我想对你的帖子发表评论,而不是给出一个大答案,但我没有这方面的声誉,嗯。

    你不能在灰化中传递函数。如果你这样做

    var x = 'HELLO'
    spooky.then([{
        XinCasper : x
    }, function(){
        //do something with XinCasper
    }])
    

    那会奏效。如果要传递对象或数组,请使用 JSON.stringify 并在 casper 范围内重建。

    如果您想从 casper 作用域访问诡异的函数,请改用事件发射器,如下所示(主要参见最后几行):

    try {
    var Spooky = require('spooky');
    } catch (e) {
        var Spooky = require('../lib/spooky');
    }
    
    var urls = ["http://www.google.fr",
            "http://www.yahoo.com"
          ];
    
    exports.clicker = function(req, res)
    {
    console.log("FIRST: " + visitUrl + " \n\n\n END FIRST");
    
    
    var visitUrl = function(urlIndex, nbClicked)
    {
      console.log("HELLO");
    };
    
    var spooky = new Spooky(
    {
      child: {
        // transport: 'http'
      },
      casper: {
        logLevel: 'debug',
        verbose: true
      }
    }, function (err)
    {
      if (err)
      {
        e = new Error('Failed to initialize SpookyJS');
        e.details = err;
        throw e;
      }
    
      spooky.start(urls[0]);
    
      console.log("SECOND: " + visitUrl + " \n\n\n END SECOND");
    
      spooky.then(function(){
          //casper scope
          var y = 'something'
          this.emit('third', y)
      });
    
      spooky.run();
    });
    
    spooky.on('third', function(y){
        console.log('Hey, I can output ' + y + ' here.') 
    }
    

    【讨论】:

      【解决方案2】:

      最后,我使用PhantomJS-node 代替 SpookyJS 成功完成了我需要的工作。

      【讨论】:

      • JS 引用错误通过使用不同的模块解决。这是出乎意料的。 ☺
      • 我用不同的方式使用 PhantomJS-node :)
      【解决方案3】:

      显然,您正在使用变量test

      console.log("THIRD: " + test + " \n\n\n END THIRD");
      

      没有先声明。

      var test;
      

      也许用req 替换它。 :)

      【讨论】:

      • 是的,我确实声明了变量test,看看这一行:spooky.then([{ test: visitUrl }, function(){ 我是从我在原始帖子中发布的文档中找到的。
      • 这不是变量声明。您创建了一个数组[],将新对象放入{},该对象有一个属性test。它不是变量,而是匿名对象的属性。
      • 变量应该使用var关键字声明,或者声明为函数参数:function(urlIndex, nbClicked)
      • 是的,我知道,但这是来自我在原始帖子中发布的文档。我通过在 console.log 中将 test 替换为 visitUrl 进行了测试:console.log("THIRD: " + visitUrl + " \n\n\n END THIRD"); 并且我仍然有错误消息:ReferenceError: Can't find variable: visitUrl
      • 伙计,你必须了解什么是变量及其函数范围。您在这个地方没有 visitUrl。尝试从错误行中删除变量用法。
      猜你喜欢
      • 1970-01-01
      • 2014-02-20
      • 2018-04-24
      • 2016-10-30
      • 2012-03-18
      • 2015-11-16
      • 2011-05-22
      • 2014-12-16
      • 2022-01-23
      相关资源
      最近更新 更多