簡體   English   中英

node.js子進程在節點webkit中不起作用

[英]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

如何防止Node-Webkit立即崩潰

將代碼包裝在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) );
}

對於您正在經歷的追蹤問題真正原因的情況,這是一般性建議。

如何在您的node-webkit應用程序中包含二進制文件

涉及到一些事情。

  1. 在app.nw中包含二進制文件

    這應該是自我解釋的 - 但有一點需要注意:我確保通過chmod 755 將二進制文件標記為可執行文件 如果你正在使用grunt,你可能會喜歡grunt-chmod。 現在你的二進制文件是應用程序包的一部分,你可以通過知道絕對路徑來執行它們。

  2. 即使在打包時也可以在運行時解析二進制文件的路徑。 假設您的工具是多平台的,下面的代碼是我為當前平台選擇正確的二進制文件的解決方案。 此外,它假定您的二進制文件是以某種文件夾結構排序的。 或者,在構建過程中選擇正確的二進制文件,並始終使用相同的路徑。

     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; 
  3. 最終解析作為參數提供給二進制文件的路徑。 這也有點令人困惑,因為所有路徑都被視為相對於應用程序包的根路徑。 我的節點主文件駐留在我的應用程序包中的一個文件夾中,所以我認為我應該從那里引用相對文件,但事實並非如此。

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM