2822


  * casperjs@1.1.0-beta3
  * spooky@0.2.5

を使って、スクリプトに渡したコマンドラインオプションをCasperJSの`then`コールバック内で使おうとしています。他の変数はちゃんとCasperJS内から見えるのですが、`undefined`な変数はどこかで消えてしまうのか、そんな変数はないよ
("Can't find variable") と言われてしまいます。

誰が勝手に消しているのでしょうか。また、どうすれば回避できるでしょうか。

[code]

    Spooky = require 'spooky'
    
    spooky = new Spooky
      child:
        command: './node_modules/casperjs/bin/casperjs'
      casper:
        logLevel: 'info'
        verbose: false
    , (err) ->
      if err
        e = new Error 'Failed to initialize SpookyJS'
        e.details = err
        throw e
    
      spooky.on 'error', (e, stack) ->
        console.error(e)
        if (stack)
          console.log(stack)
    
      spooky.on 'console', (log) ->
        if (log.lastIndexOf('Unsafe JavaScript attempt', 0) == 0)
          return
        console.log(log)
    
      spooky.start 'http://example.com'
      spooky.then [{
        foo: 'bar'
        hello: undefined
      }, ->
        @echo foo
        @echo hello
      ]
      spooky.run()
    
[/code]

出力:

[code]

    $ coffee hello.coffee
    bar
    ReferenceError: Can't find variable: hello
    [ { file: '', line: 5, function: '' },
      { file: '/path/to/node_modules/casperjs/modules/casper.js',
        line: 1553,
        function: 'runStep' },
      { file: '/path/to/node_modules/casperjs/modules/casper.js',
        line: 399,
        function: 'checkStep' } ]
    ReferenceError: Can't find variable: hello
      /path/to:5
      /path/to/node_modules/casperjs/modules/casper.js:1553 in runStep
      /path/to/node_modules/casperjs/modules/casper.js:399 in checkStep
    { [Error: Child terminated with non-zero exit code 1] details: { code: 1, signal: null } }
    
[/code]


CC BY-SA 3.0
2014-12-30T08:22:39.050
2821
2015-01-29T15:09:44.000
2014-12-30T14:21:42.313
30
30
question
javascript casperjs coffeescript
SpookyJSで、CasperJS側にundefinedな変数を渡せない


`undefined`な値が消えてしまうのは、[JSON](http://www.json.org/)で許容されていないためです:
SpookyJSとCasperJS間の通信は、[JSON.stringifyでデータを渡す](https://github.com/WaterfallEngineering/SpookyJS/blob/v0.2.5/lib/spooky.js#L129)ようになっています。

JSONで許容される値は、`string` `number` `object` `array` `true` `false` `null` のみです。

`undefined`になる可能性がある変数は、事前にチェックして`null`や`false`に強制変換することで回避できます。

[code]

    hello = hello || false
    
[/code]

もしくは一般化して:

[code]

    var context = {foo: 'bar', hello: undefined};
    for (var key in context) {
      if (typeof context[key] === 'undefined') {
        context[key] = false;
      }
    }
    
[/code]

[code]

    var context = {foo: 'bar', hello: undefined};
    
    for (var key in context) {
      if (typeof context[key] === 'undefined') {
          context[key] = false;
      }
    }
    
    $('#console').text(JSON.stringify(context));
[/code]

[code]

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div id="console"></div>
[/code]


CC BY-SA 3.0
2014-12-30T08:22:39.050
2822
2014-12-30T14:27:14.887
2014-12-30T14:27:14.887
30
30
2821
answer