close

程式的運行,盡可能減少error跟warning出現,在console的畫面中,除了自己預期的log,我都會盡量避免unexpected 事件出現;

常見的就是 npm ERR! code ELIFECYCLE


做了幾個專案,都會用到mongoose來操作mongoDB,也必會設定seed的scripts;

正常使用node XXX.js 執行完之後,會可以繼續在CLI裡面輸入其他指令(即執行完後就關閉該js檔),但是使用mongoose連線資料庫成功後,會一直在連線狀態,並不會跳出,要跳出需要ctrl+c跳出,這時候就會出現npm error
npmERRcodeELIFECYCLE.png
很明顯是因為,直接終止程式,但沒有正常disconnect mongodb連線;

這可能沒辦法避免,因為server通常是一直run的,中斷時產生錯誤,也蠻正常的;
但是,使用seed時,連線一直在,執行完seed.js時,不會自動跳出,必須手動跳出,會使使用的人非常不直覺,必須要解決這個問題;

 

現在看起來答案很明顯,只要終止mongoDB的連線,就可以跳出了,那就在seed.js擺上mongoose.disconnect()就行了,但是,我沒有這麼早發現是連線的問題。


因此,一開始我用process.exit([code]) 的方式將code地方帶入1,
不過執行完的時候,依然顯示npm ERR! code ELIFECYCLE;
並且在error顯示錯誤的提示是:
npm ERR! Failed at the urlShortener@1.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

壓根看不出來是哪裡出問題。

接著我開始尋找mongoDB的文件,找到cursor.close()或db.close()的說明,但是都不符合我專案內的架構...
再繼續,我尋找process.disconnect()與ChildProcess.disconnect()的用法,經一翻研究,除了app.js這個主要process,我沒有其他有關node.js的subprocess…

經過近一小時的搜尋:
Ctrl+c顯示錯誤,使用process.exit()也產生一樣的錯誤訊息
可以判斷,這跟nodejs環境停用其實沒有關係,
我也沒有其他subprocess,
唯一有關聯的mongoDB是在windows(我的本機作業系統是windows),
也跟nodejs沒關係,如果close mongoDB 那我還得再啟動一次。

我才發覺,我的搜尋目標錯誤!

我在nodejs操作mongoDB是使用mongoose,我要處裡的應該mongoose這個ODM(Object Relational Model,物件關聯模型)的連線問題。


又開始新一輪尋找

有關mongoose的connection在官方文件沒有說明disconnect的部分,只提到connection event

沒錯,我還是找錯地方,應該直接前往API的部分找尋功能

很快就搜索到Mongoose.prototype.disconnect(),Mongoose物件的原型有disconnect功能;
他的說明提到:
[callback] «Function» called after all connection close, or when first error occurred
他是callback的function,當所有連線中斷,或有第一個錯誤發生時。

 

因此,有兩個做法可以中斷與mongoDB的連線:
A. 在connection 的物件用connection.close() ,所有連線(在本專案我只有一個連線)中斷後,自動callback mongoose.disconnect()。
B. 在mongoose 的物件用 mongoose.disconnect(),直接中斷所有連線。

npmSUCCESSexit.png
最後,我終於成功在npm run seed 時,只輸出我想要的東西,跳出process了!


社會上需要有解決問題能力的人(可參考 2017,何飛鵬,你有解決問題的能力嗎?,經理人),這個能力需要大量練習,

「要解決,要先發現」

整個過程直到發現需要解決的目標後,進展會非常快,
還沒被解決的問題,有可能是根本還沒發現要解決的具體問題是甚麼!
雖然本次我走過一些冤枉路,不過都是學習的過程,我也一並理解process的部分功能,想到未來也會處理有多個process狀態的程式,也不是一種冤枉路,提前先看到了而已。

不要覺得浪費了時間,應該考慮獲得了多少;
這件事是我喜歡的事嗎?我不覺得這個過程是浪費!

 

arrow
arrow
    創作者介紹
    創作者 中意 的頭像
    中意

    中意悾間

    中意 發表在 痞客邦 留言(0) 人氣()