node.js子进程在节点webkit中不起作用

时间:2014-11-14 06:30:12

标签: node.js node-webkit pdftk

我用node webkit创建了一个小应用程序。预包装,它工作正常。但是在我将其压缩并将其添加到node-webkit.app中的Contents / Resources之后,我在运行应用程序时遇到错误。它打开很好,但它的任务涉及子进程,我得到这个错误:

未捕获的node.js错误 错误:产生ENOENT。

我猜这可能与此问题中提出的问题有关:Node-Webkit Child Process Exec

因为我的子进程正在调用pdftk,这是一个单独的命令行程序。最终,我想安装pdftk作为我的应用程序的一部分 - 我无法弄清楚如何做到这一点。我尝试将其作为要与应用程序的其余部分压缩的内容之一,但这导致应用程序在启动后立即崩溃(它将打开一个具有正确标题但没有内容的窗口,这将立即关闭)。 / p>

所以,主要问题是,如何将pdftk作为打包的node-webkit应用程序的一部分进行安装,以便只需双击图标而不是使用命令行即​​可启动应用程序?谢谢你的帮助。

2 个答案:

答案 0 :(得分:4)

我假设您的代码是通过node-webkit的node-main入口点执行的:https://github.com/rogerwang/node-webkit/wiki/Node-main

如果任何 异常在您的应用程序中未被捕获,那么将崩溃

可悲的是,目前用于获取crashdumps的破解功能在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.   
  3. 即使在打包时也会在运行时解析二进制文件的路径。假设您的工具是多平台的,下面的代码是我为当前平台选择正确的二进制文件的解决方案。此外,它假定您的二进制文件是以某种文件夹结构排序的。或者,在构建过程中选择正确的二进制文件,并始终使用相同的路径。

    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;
    
  4. 最终解析作为参数提供给二进制文件的路径。这也有点令人困惑,因为所有路径都被视为相对于应用程序包的根路径。我的节点主文件驻留在我的应用程序包中的一个文件夹中,所以我认为我应该从那里引用相对文件,但事实并非如此。

    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
    
  5. 要使用我的服务器文件调用节点二进制文件,以下行导致成功:

        child_process.spawn(absPathToNodeBin, "server/src/server.js");
    

答案 1 :(得分:0)

这是我的经历:

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 *');