こんにちは、以下のコードはnode.jsの非同期関数です。この関数は、pdfファイルを生成するrubyファイルを呼び出してから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
これはルビーエラーのようです。たぶん、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
、execへの現在のディレクトリはベースディレクトリであるため、rubyファイルは同じディレクトリにある必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加