如何debugging这个nodejs代码?

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

$ node -v // -> v0.6.6 

我现在使用https://github.com/kriskowal/q/blob/master/q.js中的最新q.js 我将代码复制到我的testq.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) 

我安装了用于eclipse的v8debugging器插件 ,逐行debugging它。 不幸的是,我找不到错误的开始。

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


UPDATE

根据霍根的回答,代码是:

 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

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

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

那么你会很高兴。


看Q文档,我相信你想'Q.node(…)或Q.CALL(…)或Q.fcall(…)

我会再读一下Q,或者如果你描述你想要做什么,我可能会提供帮助。


step1采取一个参数 – 一个函数。

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

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

  function step1(callback) { console.log("step1"); callback("abc"); }; var Q = require("q"); Q.call(step1) 

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; } 

使用这些同步版本的step1和step2,你会发现上面的( * )现在可以工作


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

 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(); 

您需要使用fcall而不是呼叫。 call是一个保留的JavaScript函数。