Javascript 回调异常[TypeError:侦听器必须是函数]

Javascript 回调异常[TypeError:侦听器必须是函数],javascript,node.js,callback,child-process,Javascript,Node.js,Callback,Child Process,我已经编写了一个简单的NodeJS程序来执行shell脚本。我拿出一个孩子,试着执行脚本。我在退出时提供了一个回调,如下所示。但是当我试图运行程序时,它抛出了一个异常。我哪里做错了 var exec = require('child_process').exec; function callXmlAgent(callback) { try { var child = exec('./a.sh'); var response = { stdout: '',

我已经编写了一个简单的NodeJS程序来执行shell脚本。我拿出一个孩子,试着执行脚本。我在退出时提供了一个回调,如下所示。但是当我试图运行程序时,它抛出了一个异常。我哪里做错了

var exec = require('child_process').exec;

function callXmlAgent(callback) {
    try {
        var child = exec('./a.sh');
        var response = { stdout: '', stderr: '', errCode: -1 };

        child.stdout.on('data', function (data) {
            response.stdout += data;
        });

        child.stderr.on('data', function (data) {
            response.stderr += data;
        });

        child.on('close', function (errCode) {
            if (errCode) {
                response.errCode = errCode;
            }
        });

        child.on('exit', callback(response));

        process.on('exit', function () {
            // If by chance the parent exits, the child is killed instantly
            child.kill();
        });
    } catch(exception) {
        console.log(exception);
    }
}

function foo(response) {
    console.log(response)
};

callXmlAgent(foo);
我得到的结果是:

{ stdout: '', stderr: '', errCode: -1 }
[TypeError: listener must be a function]

使用以下代码修改子退出事件:

child.on('exit', function() {
   callback(response);
});
现在它不再抛出错误,但请注意,使用异步数据并不能保证执行顺序,因此可能会产生意外的结果


问题是您不能在另一个函数中传递带有参数的函数。您必须创建一个匿名函数并发送其中的参数。

使用以下代码修改子退出事件:

child.on('exit', function() {
   callback(response);
});
现在它不再抛出错误,但请注意,使用异步数据并不能保证执行顺序,因此可能会产生意外的结果


问题是您不能在另一个函数中传递带有参数的函数。您必须创建一个匿名函数并发送其中的参数。

是。它似乎确实消除了这个例外。但问题是什么?它是否期待一个具有特定签名的函数?@honk:谢谢,我已经做了。我不熟悉stackoverflow;)@安德烈西瓜拉达:这是一个非常好的贡献,谢谢!只要你感到新鲜,每天只需访问网站并阅读几段即可。这将帮助您快速熟悉堆栈溢出。是的。它似乎确实消除了这个例外。但问题是什么?它是否期待一个具有特定签名的函数?@honk:谢谢,我已经做了。我不熟悉stackoverflow;)@安德烈西瓜拉达:这是一个非常好的贡献,谢谢!只要你感到新鲜,每天只需访问网站并阅读几段即可。这将帮助您快速熟悉堆栈溢出。