[NodeJs]拿不到mysql查詢返回的數據?你可能還沒試過這招
- 解決
nodejs
分離mysql
模塊後,能在模塊內console.log
出數據,主模塊卻拿不到的問題
導讀
- 緣由
- 解決方案
緣由
- 曾經在剛剛初學
nodejs
的時候,就想要把nodejs
和mysql
鏈接起來;於是便在網絡上簡單學習了nodejs
鏈接mysql的教程,但當時所有代碼都擠在一個app.js
裏面,但當我去將mysql
的模塊專門從app.js
中抽離的時候,問題發生了。(今天拿一個簡單的小項目來舉例)
- 這樣的寫法,雖然能夠
console.log
出數據,但是app.js
是接收不到的(通過console.log
逐步查找出來的原因),因此我們去訪問這個接口,也拿不到任何數據
- 雖然知道這大機率是異步的問題,但處理起來還是令人頭疼
- 因爲這樣的問題,大多都是執行函數,但
result
還沒有被查詢到並賦值,函數就已經給我返回了result
- 這裏的執行順序是,訪問接口,觸發
getdata()
函數,然後將返回值發送
- 而這裏的執行順序就比較有意思了,先是進入函數,然後進入db.query的函數體,此時
result
還沒有被查詢到,log也被略過,直接先執行了return
,然後就返回了一個未被定義的空值
- 如果你細心,去挨個調試輸出也能發現這個奇妙的問題。
- 而且,data 居然是先輸出了
undefined
,而查詢結果卻在後面;顯然,這是執行順序的鍋。
-
按照正常的邏輯,這些數據需要我每訪問一次就從數據中查詢一次,如果直接將查詢過程變爲一次性的(每次啓動服務的時候纔會重新去sql查詢),那麼就可以解決問題,但這怎麼看,也不像解決了問題,很多數據是需要立即獲取的,比如說很多實時更新的信息,這時候你想要通過重啓服務才能查看最新信息,很顯然是不現實的。
-
一時間,陷入僵局。。。
解決方案
-
因爲這個問題,我翻閱了其他人上百篇的博客,發現此類的極少,因爲他們做演示的時候大多都是在一個 app.js文件下執行的,根本沒有分離的過程,也沒有這樣的問題。
-
但功夫不負有心人,通過國外的幾篇問題貼,我強忍着翻譯後生硬的話語,去看出了其中的玄機。
-
直接獲取不到的結果,可以通過回調函數來返回。
-
改造。。。。
-
改造後的代碼如下
6. 在寫法上的確和之前有了變動,這次我們再次打開瀏覽器,數據躍然屏上