[英]node.js child process doesn't work in node webkit
我用node webkit創建了一個小應用程序。 預包裝,它工作正常。 但是在我將其壓縮並將其添加到node-webkit.app中的Contents / Resources之后,我在運行應用程序時遇到錯誤。 它打開很好,但它的任務涉及子進程,我得到這個錯誤:
未捕獲的node.js錯誤錯誤:生成ENOENT。
我猜它可能與這個問題中提出的問題有關: Node-Webkit Child Process Exec
因為我的子進程正在調用pdftk,這是一個單獨的命令行程序。 最終,我想安裝pdftk作為我的應用程序的一部分 - 我無法弄清楚如何做到這一點。 我嘗試將其作為要與應用程序的其余部分壓縮的內容之一,但這導致應用程序在啟動后立即崩潰(它將打開一個具有正確標題但沒有內容的窗口,這將立即關閉)。
所以,主要問題是,如何將pdftk作為打包的node-webkit應用程序的一部分進行安裝,以便只需雙擊圖標而不是使用命令行即可啟動應用程序? 謝謝你的幫助。
我假設您的代碼是通過node-webkit的node-main入口點執行的: https : //github.com/rogerwang/node-webkit/wiki/Node-main
如果發生任何 異常 (那里) 沒有在您的應用程序中捕獲 將崩潰 。
可悲的是,目前獲得故障轉移功能的破壞功能在OSX上無效: https : //github.com/rogerwang/node-webkit/issues/2518
將代碼包裝在try / catches中以防止崩潰並獲取崩潰發生原因的信息。
try {
the_child_process = child_process.spawn(pathToBin, args);
} catch (err) {
global.console.log( "Error while trying to start child process: " + JSON.stringify(err) );
}
對於您正在經歷的追蹤問題真正原因的情況,這是一般性建議。
涉及到一些事情。
這應該是自我解釋的 - 但有一點需要注意:我確保通過
chmod 755
將二進制文件標記為可執行文件 。 如果你正在使用grunt,你可能會喜歡grunt-chmod。 現在你的二進制文件是應用程序包的一部分,你可以通過知道絕對路徑來執行它們。
即使在打包時也可以在運行時解析二進制文件的路徑。 假設您的工具是多平台的,下面的代碼是我為當前平台選擇正確的二進制文件的解決方案。 此外,它假定您的二進制文件是以某種文件夾結構排序的。 或者,在構建過程中選擇正確的二進制文件,並始終使用相同的路徑。
var arch = process.arch; var platform = process.platform; // this will return the root path of your app-package at runtime var rootDir = process.cwd(); var isWin = false; var execPath = rootDir; // some base path is appended execPath = path.join(execPath, 'path', 'to', 'bin'); // select folder for current platform switch (platform) { case 'darwin': execPath = path.join(execPath, 'mac'); break; case 'linux': execPath = path.join(execPath, 'lin'); break; case 'win32': execPath = path.join(execPath, 'win'); isWin = true; break; default: global.console.log("unsupported platform: " + platform); return null; } // select folder for current processor architecture switch (arch) { case 'ia32': execPath = path.join(execPath, 'x86'); break; case 'x64': execPath = path.join(execPath, 'x64'); break; default: global.console.log("unsupported architecture: " + arch); return null; } // add executable filename execPath = path.join(execPath, 'node'); if (isWin) { execPath = execPath + ".exe"; } global.console.log("Path to your binary: " + execPath); return execPath;
最終解析作為參數提供給二進制文件的路徑。 這也有點令人困惑,因為所有路徑都被視為相對於應用程序包的根路徑。 我的節點主文件駐留在我的應用程序包中的一個文件夾中,所以我認為我應該從那里引用相對文件,但事實並非如此。
app package root |--- package.json <- node-webkit package.json | |--- client <- here my sources for the frontend reside | |--- server |----|--- node_modules <- server runtime dependencies |----|--- src <- server source code |----|----|--- server.js <- this is my node server file to execute via node | |--- node-webkit <- node webkit code and dependencies |----|--- bin <- a directory with my deployed binaries |----|--- node-main.js <- this is my node main file
要使用我的服務器文件調用節點二進制文件,以下行導致成功:
child_process.spawn(absPathToNodeBin, "server/src/server.js");
這是我的經歷:
var child_process = nw.require('child_process');
//exec var exec = child_process.exec; var ret = exec('cat *');
//spawn var sp = child_process.spawn; var sr = sp('cat *');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.