2014-01-07 38 views
1

我所列出的一些代碼:在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'); 

} 

它的出現,即使我對res.send斷點()函數中。然後和.fail調用的db.put函數調用它並沒有停止它們中的任何一個。然而,console.log('more testing');和console.log('something');達到沒有錯誤。

我使用Webstorm,但即使我只是一個終端和文本編輯器定期執行該代碼似乎對db.put代碼(......)只是被跳過莫名其妙。有關其他故障排除/調試的想法?

我也注意到這個調用正在發出的數據源也是活的並且接受命令。只是爲了確保我發佈了幾個curl命令,並確保數據正常進入並出現。

這裏的解釋是怎麼回事視頻: http://youtu.be/CKq69z4ml8o

更新#1:我也試過每個建議制定「{‘測試’:‘測試1’}」爲{「測試」:」 test1「}這似乎是一個好主意,仍然沒有去。

UPDATE#2: Per @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

+0

您正在向遠程數據庫發送數據是否正確?該數據庫是否正常工作?只有當結果已知時,才執行then/fail函數。也許遠程機器需要很長時間才能做出響應。 – diolemo

+0

添加了對問題的更新以闡明遠程數據庫的狀態。好問題。 – Adron

+1

您的計劃是否在投注之前退出?很難說沒有更多的上下文,但是如果這個模塊直接執行然後退出,那麼事件隊列就不會運行那些異步處理。 –

回答

2
  1. 你沒有明確你正在使用的數據庫模塊。基於上下文線索,它看起來像this orchestrate module,這是正確的嗎?
  2. OMG youtube!把你的代碼放在你的問題中。包括你初始化db的地方,這是最重要的部分,它允許你通過改變你在這裏發佈的文本來隱藏你的令牌......你可能想要取消這些視頻或更改你的令牌,你絕望了在第一個視頻中損害了您的安全。是的,這是模糊的,但不是模糊。

好的,您的第一個故障排除步驟是創建一個簡化的腳本。我的猜測是你以某種方式錯誤地使用了模塊。試試這個:

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

...有幾個重要的事情,我希望你把這裏注意:

  • 隱藏您的令牌(嚴重的是,隱藏自己的令牌)
  • 我從工作我鏈接的模塊的文檔,但如果您使用的是不同的東西或以任何方式進行了修改,則所有這些建議都是可疑的
  • Per @ nhaa123s註釋和文檔,值是對象字面值,而不是一個JSON字符串,所以我做了這個調整
  • 根據鏈接的文檔,musician是集合名稱,1是您要設置的關鍵(這似乎是一個奇怪的關鍵名稱,但無論如何)和{test:'test1'}是您的數據結構'正在使用你的價值。我從未使用過協調,請確保你已經正確初始化musician如果需要,並請確認它將支持嚴格的數字鍵,像1(或者更好,使用更傳統的按鍵式像testkey
  • 我使用了console.log,因此您可以確認回調函數的執行更簡單。

...您可能會看到幾個不同的結果,具體取決於問題的實際位置。如果您正確使用數據庫模塊,那麼您應該執行.then()回調,並知道問題在於如何將它合併到代碼中。如果失敗並且您在控制檯上收到失敗消息,則會看到實際的錯誤,這可能會導致您朝着正確的方向前進。如果您永遠不會撥打.then().fail()回調,那麼編排模塊可能無法在黃金時間準備好,或者您的依賴鏈中存在一些不兼容問題。

如果您可以成功執行該代碼段,則下一步就是將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. 
} 

...應該設置你在正確的道路上。

+0

超級密碼在視頻後被改變;;) – Adron

+0

這也讓我朝着正確的方向前進。我也去了,並開始沿着這些線做一些BDD/TDD,並最終使用完成的異步代碼的簡單測試模式:http://stackoverflow.com/questions/21175123/how-do-i-use-mocha-to -do-asynchronous-tests-using-done – Adron

+0

很高興它有幫助:) – Jason

1

嘗試更換'{"test":"test1"}'{"test":"test1"}

+0

會放棄一下。 – Adron

1

只是想一想,你有沒有試過重載db.put函數?

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

+0

嘗試過......仍然沒有走。 :( – Adron

1

在看你的第二個視頻,看來你期待,你跨過他們分配的功能得到執行。 (例如47s into the second video)。什麼你實際上做的是分配db.put功能(A,B,C),不執行它。所以,就像你在視頻中提到的那樣,它有意義地跳過身體。

但是,它應該最終執行它。它是否跳過了你放入的斷點?

因爲我不知道什麼Webstorm,我認爲最可靠的方式來得到它在你的再突破和失敗的功能是把明確調試器像這樣聲明:

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

} 

然後通過本機節點debugger運行:

node debug yourapp.js 

在調試器,鍵入C繼續,那麼就應該當它擊中調試聲明停止。

+0

是的,它似乎從來沒有捕獲任何.then或.fail代碼我知道db.put是非阻塞的,但我失去了爲什麼沒有發生過這種情況 理論上來說這兩個那麼最後還是應該執行的,對嗎? – Adron

+0

嗯,我不知道你在用哪個數據庫模塊,所以我不能說這是真的,但這是合理的,我用一個可以嘗試的替代調試測試更新了我的答案。 – Jim

+0

立即嘗試 – Adron

1

我不確定可以在沒有關於其他程序的更多細節的情況下回答這個問題,但它看起來像一個經典的「爲什麼我的異步代碼不能同步運行?」問題(這裏有很多這樣的 - here's the canonical example)。

db.put()幾乎可以肯定是異步 - 它看起來像它返回一個promise,所以,當你的異步數據庫寫入完成後,它將執行要麼.then()功能或.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已經改變,不是一個可用的流了,或者
  3. 數據庫寫入默默地死去。

(2)可以用回調中的斷點或console.log調用排除,它看起來像您已經嘗試過。 (3)如果數據庫模塊穩定不太可能。 (1)很難在沒有看到其他代碼的情況下進行評估,但似乎最有可能。

如果你明白這一切,並期待異步回調,那麼不要緊。

1

如果this是您正在使用的管絃樂包,那麼我會看到它使用kew作爲其承諾管理器。此包的文檔建議使用.end()來調用末端鏈thenfail。從做了快速測試,我可以看出,除非您在鏈條末尾添加此.end()呼叫,否則您將無法捕捉到某些類型的錯誤。所以試試這樣的:

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. 

這可能會導致報告錯誤。