2013-10-03 11 views
7

To naprawdę irytuje. Nie mogę znaleźć nigdzie w moim kodzie gdzie robię coś nielegalnego, ale z jakiegoś powodu wywołanie fork wysadza mój program. Oto kod. Odpowiednia część znajduje się w svgToPNG, gdzie nazywam się fork.Coffeescript nieoczekiwany token NIELEGALNIE, ale nie powinno być niczego nielegalnego

{fork} = require 'child_process' 
{Coral} = require 'coral' 

svgToPNG = (svg, reply, log) -> 
    log "converting SVG to a PNG" 
    # set up a child process to call convert svg: png:- 
    convert = fork '/usr/bin/env', ['convert', 'svg:', 'png:-'] 
    log "Spawned child process running convert, pid " + convert.pid 
    # set up behavior when an error occurs 
    convert.stderr.on "data", -> 
    log "Error occurred while executing convert" 
    reply "error" 
    # set up behavior for when we successfully convert 
    convert.stdout.on "data", -> 
    log "Successful conversion! :)" 
    log "here's the data: " + data 
    reply data 
    # pipe the SVG into the stdin of the process (starting it) 
    convert.stdin.end svg 

Jeśli wezmę linię fork się i zastąpić go czymś innym, wszystko jest hunky dory, ale jeśli mogę zostawić go w, otrzymuję:

> coffee src/coral_client.coffee 
finished doing conversion to svg! 
converting SVG to a PNG 
Spawned child process running convert, pid 60823 

/usr/bin/grep:1 
(function (exports, require, module, __filename, __dirname) { ���� 
                  ^
SyntaxError: Unexpected token ILLEGAL 
    at Module._compile (module.js:439:25) 
    at Object.Module._extensions..js (module.js:474:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Function.Module.runMain (module.js:497:10) 
    at startup (node.js:119:16) 
    at node.js:901:3 

To nie ma sensu. Nie mam żadnych dziwnych nielegalnych znaków Unicode, takich jak w this question, nie sądzę, że mam jakikolwiek błąd parsowania, jak w this one ... Naprawdę nie wiem, co się dzieje.

Czy to możliwe, że CoffeeScript w jakiś sposób łamie kod? To wydaje się mało prawdopodobne, ale nie wiem.

+0

Jakiego pliku konwertujesz? Czy nie powinno to być 'convert svg: somefilename png: -'? – hpaulj

+0

Czy próbowałeś skompilować ten skrypt, a następnie uruchomić 'js' z' węzeł'? Jeśli 'js' wygląda dobrze, problem nie dotyczy coffeescript. – hpaulj

+0

@hpaulj plik svg jest podłączony do standardowego wejścia procesu. –

Odpowiedz

2

Błąd jest w użyciu fork. fork służy do tworzenia procesów węzłów, tj. foo.js. Zamiast tego użyj spawn.

Wyjaśniałem to, uruchamiając uproszczoną wersję kodu, czytając plik obrazu, a następnie przekazując go do svgToPNG. Komunikat o błędzie zaczyna:

/usr/bin/env:1 
(function (exports, require, module, __filename, __dirname) { ELF 

Znaki świadczone w tym kopiuj/wklej jako ELF są postacie szef mojego binarnym /usr/bin/env pliku. Tak więc node.jsfork próbuje skompilować plik /usr/bin/env. Przegląd dokumentacji child_process potwierdza to. Przykłady używające rzeczy takich jak ls i grep używają spawn.

+0

Świetnie! Dziękuję za tonę! –

Powiązane problemy