我列出了一些代码:
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,但即使我只是使用终端和文本编辑器定期执行此代码,似乎也只是以某种方式跳过了 db.put(...) 的代码。关于其他故障排除/调试的任何想法?
我还注意到,此调用发出 put 的数据源也处于事件状态并接受命令。只是为了确保我发出了几个 curl 命令并确保数据传入和传出都很好。
这是一段解释发生了什么的视频: http://youtu.be/CKq69z4ml8o
更新 #1: 我也尝试了将 '{"test":"test1"}' 变成 {"test":"test1"} 的建议,这似乎是个好主意,但仍然不行。
更新#2:根据@hafthor,我尝试了另一个建议并实现了这样的代码以消除可能的分号问题。
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 中运行代码和调试时发现代码进入了 db.put,但随后我尝试进入代码,它直接进入 .fail,然后跳出并结束于 console.log('something');行。
此外,还有另一个视频,用于进一步尝试使其正常工作:http://www.youtube.com/watch?v=rItBhyfG5AY
最佳答案
- 您未能明确说明您正在使用的数据库模块。根据上下文线索,它看起来像 this orchestrate module , 对吗?
- YouTube 天啊!将您的代码放在您的问题中。包括初始化
db
的地方,它是最重要的部分,它允许您通过更改您在此处发布的文本来隐藏您的 token ......您要么想要删除这些视频或更改你的 token ,你在第一个视频中无可救药地破坏了你的安全。是的,它很模糊,但没那么模糊。
好的,您的第一个故障排除步骤是创建一个简化的脚本。我的猜测是您以某种方式错误地使用了该模块。试试这个:
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');
...我希望您在这里注意几件重要的事情:
- 隐藏你的 token (说真的,隐藏你的 token )
- 我正在根据我链接的模块的文档工作,但如果您使用不同的东西或以任何方式修改它,所有这些建议都是可疑的
- 根据@nhaa123s 的评论和文档,该值是对象文字,而不是 JSON 字符串,因此我进行了调整
- 根据链接文档,
musician
是集合名称,1
是您要设置的键(这似乎是一个奇怪的键名,但无论如何) , {test:'test1'} 是您为您的值(value)使用的数据结构。我从未使用过 orchestrate,如果需要,请确保您已正确初始化musician
,并请确认它将严格支持数字键,例如1
(或,更好的是,使用更传统的 key 类型,如testkey
) - 我使用了 console.log,因此您可以确认回调正在更简单地执行。
...您可能会看到几种不同的结果,具体取决于问题的实际所在。如果您正确使用数据库模块,那么您应该执行 .then()
回调并知道问题在于您如何将它合并到您的代码中。如果它失败并且您在控制台上收到失败消息,您将看到实际的错误,这可能会引导您朝着正确的方向前进。如果您从不调用 .then()
或 .fail()
回调,那么 orchestrate 模块可能还没有准备好,或者您的依赖项存在一些不兼容性链。
如果您可以成功执行该代码段,下一步就是将 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
在您的函数中不可访问,您只需要找到一种方法使其进入作用域,或许可以通过将其与 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.
}
...这会让您走上正确的道路。
关于javascript - 跳过 Node.js JavaScript 片段中的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20984211/