Асинхронная функция в файле rude вызова Nodejs - PullRequest
0 голосов
/ 04 мая 2018

Здравствуйте, приведенный ниже код является асинхронной функцией в node.js. Эта функция должна вызывать файл ruby, который генерирует pdf-файл, после чего преобразует pdf-файл в base64 (удаляет pdf-файл) и возвращает строку base64! Итак, моя проблема в том, что когда exec вызывает файл ruby, я получаю сообщение об ошибке, как показано ниже, как я могу ее решить? Странно то, что если я правильно использую код без функции асинхронной функции! Дело в том, что я вынужден использовать его силой

Структура каталогов:

server.js
Router/Rapportini.js --> Call RapportiniController.js
Controller/RapportiniController.js --> Call RapportiniModel.js
Model/RapportiniModel.js -> This is file below

Ошибка:

 { Error: Command failed: ruby report.rb prova prova2 prova3
ruby: No such file or directory -- report.rb (LoadError)

    at ChildProcess.exithandler (child_process.js:275:12)
    at emitTwo (events.js:126:13)
    at ChildProcess.emit (events.js:214:7)
    at maybeClose (internal/child_process.js:925:16)
    at Socket.stream.socket.on (internal/child_process.js:346:11)
    at emitOne (events.js:116:13)
    at Socket.emit (events.js:211:7)
    at Pipe._handle.close [as _onclose] (net.js:567:12)
  killed: false,
  code: 1,
  signal: null,
  cmd: 'ruby report.rb prova prova2 prova3' }

Код:

const fs = require('fs');
var base64 = require('file-base64');
var exec = require("child_process").exec;


async function GenerazioneRapportino()
{
  exec('ruby report.rb prova prova2 prova3', function (err, stdout, stderr) {

    var encode="";

    if(stderr)
    {  
       console.log("Err: ",err);  
       return encode;  
    }

    else
    {
         console.log("File generate: ",stdout);

         base64.encode('rapportino.pdf', function(err, base64String) {

           fs.unlink('rapportino.pdf', (err) => {

              if (err) 
              {
              console.log("Err del file rappportino.pdf");
              }
              else
              {              
              console.log('rapportino.pdf was deleted');
              }

           });

          encode=base64String;          
          return encode;

        });
    }

   });

};

Код Ruby:

require "prawn"
require "prawn/table"


puts "sono dentro ruby"

logo=Dir.pwd+"/logo.jpg"
tecnicofirma=Dir.pwd+"/logo.jpg"
clientefirma=Dir.pwd+"/logo.jpg"
ragionesociale=ARGV[0]
nomecantiere=ARGV[1]
note=ARGV[2]

First= ['aa', 'aa', 'aaa', 'ddd', 'eee', 'fff']
Second = ['aa', 'bb', 'cc', 'dd', 'ee', 'ff']
Third = ['a', 'b', 'c', 'd', 'e', 'f']

Prawn::Document.generate("rapportino.pdf") do
  move_down 10
  image logo,:width=>540,:height=>60
  move_down 30
  text "Ragione Sociale:   "+ragionesociale
  move_down 30
  text "Nome Cantiere:     "+nomecantiere
  move_down 30
  text "Note:  "+note
  move_down 30
  table([
  ["Articolo - Risorsa", "Descrizione", "Quantita"],
  *[First,Second, Third]
  .transpose
  ], :width => 550)
  move_down 170
  text "Il Tecnico:", :align => :left
  text "Il Cliente:", :align => :right
  image tecnicofirma,  :width=>90, :height=>50, :position => :left
  image clientefirma,  :width=>90, :height=>50, :position => :right
end

1 Ответ

0 голосов
/ 04 мая 2018

Это похоже на ошибку ruby. Может быть, использование модуля path и получение полного пути решит эту проблему, вы уже пробовали это?

Я пробовал:

const { exec } = require('child_process')

async function run() {
    exec('ruby test.rb', (err, stdout, stderr) => {
      console.log(err, `ruby returns ${stdout}`)
    });
}

run()

Все хорошо с этим асинхронным кодом ... Похоже, что вашего файла ruby ​​нет, если вы запустите node server.js, ваш файл ruby ​​должен быть в том же каталоге, потому что ваш текущий каталог для exec - это ваш базовый каталог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...