2016-01-23 66 views
1

我在節點應用程序中遇到了一些來自Firebase Web的錯誤回調問題。Firebase Web 2.4.0 Nodejs中的承諾

原來的問題是,從.SET錯誤回調顯然沒有被我希望它是被解僱。

在調試過程中,我的火力地堡NPM模塊升級到最新的2.4.0(0.10.28的NodeJS),然後注意到,有異步調用一個新的承諾的語法。

我沒有找到使用新語法的例子,但做fiddle,似乎在我的預期在瀏覽器中的工作方式。

var fb = new Firebase("https://katowulf-examples.firebaseio.com/"); 

// monitors changes and updates UI 
try { 
    fb.child('sorted_widgets').orderByChild('name').equalTo('one').once('value').then(handleSuccess).catch(handleError) 
    fb.child(undefined).once('value').then(handleSuccess).catch(handleError) 
    fb.child('sorted_widgets').set(undefined).then(handleSuccess).catch(handleError) 

} catch (err) { 
    console.error('Caught an error', err) 
} 

function handleSuccess(snap) { 
    console.log('snap: ', snap.val()) 
} 

function handleError(err) { 
    console.log('error:', err) 
} 

我現在正在嘗試使用語法,我節點應用程序時遇到這個錯誤:

TypeError: Object #<nb> has no method 'catch' 
    at myFunction (/node_scripts/my_script.js:514:19) 
    at c (/node_modules/firebase/lib/firebase-node.js:238:58) 
    at /node_modules/firebase/lib/firebase-node.js:199:710 
    at ec (/node_modules/firebase/lib/firebase-node.js:52:165) 
    at ac (/node_modules/firebase/lib/firebase-node.js:31:216) 
    at bc (/node_modules/firebase/lib/firebase-node.js:30:1259) 
    at Ii.h.Ib (/node_modules/firebase/lib/firebase-node.js:218:287) 
    at Qh.h.Jd (/node_modules/firebase/lib/firebase-node.js:185:251) 
    at Eh.Jd (/node_modules/firebase/lib/firebase-node.js:175:364) 

有一件事我在擺弄注意到的是,不是所有的錯誤都是由.catch抓()。我把Javascript Try Catch放在小提琴上來演示,但它確實是一個單獨的問題。

鑑於我遇到的問題上面的問題,我想知道是否有與我的節點安裝了錯事,所以重新安裝節點,並刪除並重新安裝我的node_modules。我還沒有取得任何進展。

是否有人得到了新的承諾語法節點的工作?有什麼建議嗎?

+1

也許你的節點版本沒有實現承諾'.catch'函數,但瀏覽器。如果不瞭解更多關於節點設置的信息,很難說。 有一件事要嘗試的是拉入一個單獨的庫來處理承諾。藍鳥是受歡迎的。嘗試做'npm install bluebird',然後在使用承諾'Promise = require(「bluebird」)''的文件的頂部。 –

+0

你*很可能是正確的@AlexKlibisz。你能否提供這個答案作爲答案,以便我可以放棄它? –

+0

我在代碼中廣泛使用承諾,'es6-promise',所以我不認爲這是問題所在。 – kpg

回答

3

我認爲有三件事怎麼回事:

  1. 節點v0.10。28並沒有帶有Promise的內建實現。
  2. Firebase模塊捆綁了Promise/A +兼容的實現,它在尚未定義的情況下使用。
  3. 我們隨Firebase提供的實現是純Promise/A +實現,不包括.catch()

然而.catch()是非常有用的,雖然不能承諾/ A的一部分+是半的標準,所以我們打算繼續前進,把它添加到我們的捆綁承諾落實在即將推出的版本,這應該解決您的問題。

在此期間,你可以做任何以下的:

  • 使用.then(null, function(err) { ... })代替.catch(function(err) { ... })
  • 導入合適承諾實施到您的環境。例如。 global.Promise = require('rsvp').Promise;
  • 升級到節點v0.12.x或更新版本,它隨內置的Promise實現(支持.catch())一起提供。
+0

我的腳本有一個依賴關係,它被NodeJS> 0.10炸燬,所以我無法升級,但我發現Firebase Promise語法可以更正確地使用更「現代」的Node版本。謝謝邁克爾! – kpg

1

當可用時,Firebase使用底層的Promise實現。它看起來像節點環境中的Promises實現不支持catch(),這不是必需的。

由於這樣的:

.then(handleSuccess).catch(handleError) 

僅僅是一個不同的符號來表示:

.then(handleSuccess, handleError) 

您可以用後者去得到它的工作。

+0

請參閱我上面的評論。我廣泛使用es6-promise,這當然支持。 catch – kpg

+0

Firebase只檢查與A +規範的兼容性,該規範目前還沒有catch()。這很可能是你回到nodejs上的承諾是['goog.Promise'](https://closure-library.googlecode.com/git-history/docs/class_goog_Promise.html)。 –

+0

我可以證實您提出的備選符號可行(與上面的藍鳥回答不同)。不過,我認爲期望Promise按照ECMAScript 2015標準工作是合理的,所以我覺得這是一個錯誤。 – kpg

0

我的初步意見的副本:

也許你的節點的版本不履行承諾的.catch功能,但瀏覽器一樣。如果不瞭解更多關於節點設置的信息,很難說。

一件事是嘗試在一個單獨的庫拉處理的承諾。藍鳥是受歡迎的。嘗試使用npm install bluebird,然後在使用Promise Promise = require(「bluebird」)的文件頂部。

一些詳細信息:

我看你現在正在使用的ES6-承諾填充工具。再一次,我不太瞭解你的節點/傳輸設置是否確定。猜測可能是Firebase sdk源代碼需要與polyfill一起傳輸,以便它對sdk生效。所以暫時還是值得臨時拉藍鳥作爲一個健康檢查。

+0

我試過藍鳥,結果相同。 – kpg

+0

@kpg是的,我可以確認我現在有同樣的問題。使用Babel 6進行傳輸,當嘗試通過承諾進行異步/等待時失敗。我一直在使用防火模塊,現在一段時間沒有任何問題,所以我會堅持一段時間。 https://github.com/casetext/fireproof –