在Node.js JavaScript片段中跳过的代码

我列出了一些代码:

function write_to_orchestrate(data_to_write) { console.log('more testing'); db.put('musician', '1', '{"test":"test1"}') .then(function (result) { res.send(result); }) .fail(function (err) { res.send(err); }); console.log('something'); } 

看来,即使我在db.put函数调用.then和.fail中的res.send()函数调用上有断点,但是它们中的任何一个都不会停止。 不过console.log('more testing'); 和console.log('something'); 达到没有错误。

我正在使用Webstorm,但是即使我只是通过terminal和文本编辑器定期执行此代码,看起来db.put(…)的代码正在被跳过。 任何想法的其他疑难解答/debugging?

我也注意到,这个调用正在发出的数据源也是活的并且接受命令。 只是为了确保我发出了几个curl命令,并确保数据正在进出。

这是一个video解释发生了什么:http: //youtu.be/CKq69z4ml8o

更新#1:我也尝试每个build议“{”testing“:”test1“}”{“testing”:“test1”}这似乎是一个好主意,仍然没有去。

更新#2: Per @hafthor我尝试了另一个build议,并执行这样的代码,以消除可能的分号问题。

 function write_to_orchestrate(data_to_write) { console.log('more testing'); db.put('musician', '1', {"test":"test1"}).then(function (result){res.send(result);}).fail(function (err) {res.send(err);}); console.log('something'); } 

它仍然没有,但我确实发现在WebStorm中运行代码和debugging代码到达db.put,但是我尝试进入代码,它只是直接到.fail,然后跳过最后在console.log('something'); 线。

此外,另一个video为更多的尝试使这个工作: http : //www.youtube.com/watch?v=rItBhyfG5AY

  1. 你没有明确你正在使用的数据库模块。 基于上下文线索,它看起来像这个编排模块 ,是否正确?
  2. OMG的YouTube! 把你的代码放在你的问题上。 包括你初始化db ,这是最重要的部分,它允许你通过改变你在这里发布的文本来隐藏你的令牌…你可能想要取消这些video或更改你的令牌,你绝望了在第一个video中损害了您的安全。 是的,这是模糊的,但不是模糊的。

好的,您的第一个故障排除步骤是创build一个简化的脚本。 我的猜测是,你以某种方式错误地使用模块。 尝试这个:

 var db = require('orchestrate')('SUPER SECRET TOKEN THAT SHOULD NOT BE IN A YOUTUBE VIDEO'); console.log('before query'); db.put('musician', '1', {test: 'test1'}) .then(function (result) { console.log('THEN!!!'); console.log(result); }) .fail(function (err) { console.log('FAIL!!!'); console.log(err); }); console.log('after query'); 

有几件重要的事情我希望你在这里注意:

  • 隐藏你的令牌(严重的是隐藏你的令牌)
  • 我正在从我链接的模块的文档开始工作,但如果您使用的是不同的东西或者以任何方式进行了修改,所有这些build议都是可疑的
  • Per @ nhaa123s评论,和文档,值是一个对象字面值,而不是一个JSONstring,所以我做了调整
  • 根据链接的文档, musician是集合的名称, 1是你试图设置的关键(这似乎是一个奇怪的关键名称,但无论),和{test:'test1'}是你使用的数据结构为了您的价值。 我从来没有使用pipe弦乐,请确保你已经正确初始化了musician ,并且确认它将支持严格的数字键,比如1 (或者更好的是使用更传统的键types,例如testkey
  • 我使用了console.log,这样就可以确认callback函数的执行更简单。

…你可能会看到几个不同的结果,这取决于问题的实际所在。 如果您正确使用数据库模块,那么您应该执行.then()callback,并知道问题在于如何将它合并到代码中。 如果失败,并且在控制台上收到失败消息,则会看到实际的错误,这可能会导致您朝着正确的方向前进。 如果您永远不会调用.fail() .then().fail()callback,那么编排模块可能无法在黄金时间准备好,或者您的依赖关系链中存在一些不兼容问题。

如果你可以成功的执行这个代码片段,你的下一步就是复制db.put().then().fail(); 链没有任何修改链到你的write_to_orchestrate()函数,删除现有的链。 如果它仍然有效,那么你已经解决了你的数据库问题,如果没有,那么我的第一个猜测是某种范围的问题,但是不可能没有看到更多的代码。

现在,我相信你的响应对象肯定有一个范围问题,所以你从来没有发过任何东西。

把它添加到你的write_to_orchestrate()函数的顶部:

 function write_to_orchestrate(data_to_write) { if (res === undefined) console.log("This is not the response you're looking for"); else console.log("Just kidding, you're (probably) good"); // etc. } 

如果你发现在你的函数中res是不可访问的,你只需要find一个方法来获得它,也许可以通过data_to_write发送它:

 function write_to_orchestrate(data_to_write, res) { if (res === undefined) console.log("The problem clearly exists even further up the chain"); else console.log("Ah, just as we expected"); // etc. } 

这应该让你走在正确的道路上。

尝试将'{"test":"test1"}'replace为{"test":"test1"}

只是一个想法,你有没有尝试重载db.put函数?

var _put = db.put; db.put = function(a,b,c){ console.log('yep'); return _put(a,b,c); }

在观看第二个video时,看起来您期待的是在您完成任务时执行的function。 (例如47秒进入第二个video )。 你实际上做的是分配db.put函数(a,b,c),而不是执行它。 所以,就像你在video中提到的那样,这是有意义的。

但是,它应该最终执行它。 它是否跳过你放入的断点?

因为我对Webstorm一无所知,所以我认为最可靠的方式是让它在你的then和fail函数中被打破,就是把如下所示的显式的debugging器语句:

 function write_to_orchestrate(data_to_write) { console.log('more testing'); db.put('musician', '1', '{"test":"test1"}') .then(function (result) { debugger; res.send(result); }) .fail(function (err) { debugger; res.send(err); }); console.log('something'); } 

然后通过本机节点debugging器运行它:

 node debug yourapp.js 

在debugging器中,inputC继续,那么当它碰到debugging器语句时应该停止。

我不确定是否可以在没有更多细节的情况下回答这个问题,但看起来这是一个经典的“为什么我的asynchronous代码不能同步运行? 问题(这里有很多这样的 – 这是典型的例子 )。

db.put()几乎是asynchronous的 – 它看起来像是返回一个promise ,所以当你的asynchronous数据库写入完成时,它将执行.fail()函数或者.fail()函数。 这里要理解的关键是这些函数并不像其他代码那样在同一个堆栈中执行 – 它们发生在未来某个未指定的时间,所以执行如下所示:

 // initial stack console.log('more testing'); db.put(...); console.log('something'); // ... time passes, the call stack is cleared // ... the database returns a status message // new stack: res.send(result); 

我最好的猜测是:

  1. 您的程序在数据库返回其状态消息之前退出,或
  2. 你的程序仍然在运行,但res已经改变了,不再是可用的stream了,或者
  3. 你的数据库写入无声地死亡。

(2)可以用callback中的断点或console.log调用来排除,看起来您已经尝试过了。 (3)如果数据库模块稳定则不太可能。 (1)很难在没有看到代码的其余部分的情况下进行评估,但似乎是最有可能的。

如果你明白这一切,并期待asynchronouscallback,那么不要紧。

如果这是你正在使用的编排软件包,那么我看到它使用kew作为它的承诺pipe理器。 这个包的文档build议使用.end()来结束链接, then调用fail 。 从做了一个快速testing,我可以看出,除非在链的末尾添加这个.end()调用,否则将会出现某些types的错误。 所以试试这样的事情:

 db.put('musician', '1', '{"test":"test1"}') .then(function (result) { res.send(result); }) .fail(function (err) { res.send(err); }) .end(); /// <<< Add this at the end of your chain. 

这可能会导致报告错误。

当你失败时有什么错误? 这是哪个: https : //docs.orchestrate.io/#errors ?

您可以尝试使用networking代理(如wireshark)并观察networkingstream量 – 与放置请求一起发送的标题是什么? 它是否与您在此处看到的内容相符: https : //docs.orchestrate.io/#key/value/put-(create/update)