如何调试这个nodejs代码?

时间:2012-05-02 15:32:19

标签: javascript debugging node.js

我正在尝试用节点学习“q”库。

$ node -v // -> v0.6.6

我现在正在使用https://github.com/kriskowal/q/blob/master/q.js中的最新q.js。我将代码复制到q.js文件中,该文件是我testq.js文件的兄弟。

testq.js的代码是:

function step1(callback) { console.log("step1"); callback("abc"); };

var Q = require("./q");

Q.fcall(step1).end();

当我运行它时:

node testq.js

报道:

E:\WORKSPACE_NODE\TestNodeJs\q>node testq.js
step1

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
          ^
TypeError: undefined is not a function
    at step1 (E:\WORKSPACE_NODE\TestNodeJs\q\testq.js:1:112)
    at makePromise.<anonymous> (E:\WORKSPACE_NODE\TestNodeJs\q\q.js:541:27)
    at makePromise.promiseSend (E:\WORKSPACE_NODE\TestNodeJs\q\q.js:325:41)
    at Array.0 (E:\WORKSPACE_NODE\TestNodeJs\q\q.js:787:28)
    at EventEmitter._tickCallback (node.js:192:40)

我安装了v8 debugger plugin for eclipse,逐行调试。不幸的是,我找不到错误的开始。

我是nodejs的新手,请帮我调试。例如。我应该使用什么工具?或者我应该尝试任何其他有用的方法?


更新

Per Hogan的答案,代码:

function step1(callback) { console.log("step1"); };

var Q = require("./q");

Q.fcall(step1).end();

可以成功运行而不会出现任何错误。

但是当我尝试时:

function step1(callback) { console.log("step1"); };

var Q = require("./q");

Q.fcall(step1)
.then(function(v) {
    console.log("finished: " +v);
}, function(err){
    console.log(err);
})
.end();

打印:

E:\WORKSPACE_NODE\TestNodeJs\q>node testq.js
step1
finished: undefined

我仍然想要一个step1会将某些内容传递给function(v) {console.log("finished: " +v);}的演示,其中v不是undefined

3 个答案:

答案 0 :(得分:1)

让你的step1看起来像这样(修改为最后一个版本):

 function step1() { console.log("step1"); return "abc" };

然后你会很开心。


查看Q文档,我相信你想要'Q.node(...)或Q.ncall(...)或Q.fcall(...)

我会更多地阅读关于Q的内容,或者如果您描述了您想要做的事情,我可能会提供帮助。


step1接受一个参数 - 一个函数。

但是当你调用它时没有定义它,因此callback("abc");未定义。

当你摆脱所有无关紧要的东西时,也许更清楚:

 function step1(callback) { console.log("step1"); callback("abc"); };

 var Q = require("q");

 Q.call(step1)

答案 1 :(得分:1)

Q文档在这一点上不是很清楚 - Q.call/Q.fcall/Q.ncall做的是采用同步函数(即返回值的函数)并转向它成了一个承诺。

在文档中有这样的情况:

function step1 () {
    var result = 10;
    console.log('step1');
    callback(result);
}

function step2 (result) {
    result += 5;
    console.log('step2');
    callback(result);
}

step1 ( function(result) {
    step2 (result, function(result) {
        result += 5;
        console.log(result);
    });
});

然后文档说您可以像这样转换它以获得相同的结果

(***)
Q.fcall(step1)
  .then(step2)
  .then( function(result) {
    result += 5;
    console.log(result);
  }).end();

我发现这里令人困惑的是两个'step1'和'step2'函数不一样:他在'promisified'版本中使用的'step1'和'step2'看起来真的像这样:

function step1 () {
    var result = 10;
    console.log('step1');
    return result;
}

function step2 (result) {
    result += 5;
    console.log('step2');
    return result;
}

使用步骤1和步骤2的这些同步版本,您会看到上面的( * )现在可以正常工作


所有这一切都很有趣(对我来说)的原因是你可以使用相同的配方来做到这一点

function step1 () {
    var result = 10;
    var deferred = Q.defer();
    console.log('step1');
    setTimeout(deferred.resolve, 2000, result);
    return deferred.promise;
}

function step2 (result) {
    result += 5;
    console.log('step2');
    return result;
}

​Q.fcall(step1)
    .then(step2)
    .then(function(result) {
        result += 5;
        console.log(result);
    }).end();

答案 2 :(得分:0)

您需要使用fcall而不是通话。 call是一个保留的javascript函数。