Cannot find module 'mysql' 不隻是‘mysql’,Cannot find module 'express' 等也是同樣的道理。
在使用nodejs的時候,難免會引用别人寫的子產品,就像在寫java代碼必須要引用第三方jar包一樣。
而在引用的時候,可以通過npm擷取,這時如果執行執行指令的位置不正确就會造成 Cannot find module 'mysql' 的錯誤。
執行指令的位置不同會造成module的安裝位置的不同,因為指令中不帶-g ,是會安裝到目前路徑下的:
(1和2都是錯誤安裝位置,3位正确安裝位置,原因在最後)
1.在任意位置執行指令 : npm install mysql -g 那麼此module會出現在 C:\Users\SMouse\AppData\Roaming\npm\node-modules 目錄下,如下圖
(執行指令)
(檔案位置)
2.在nodejs的安裝目錄下執行 :npm install mysql ,那麼‘mysql’ 子產品就會安裝到下面的node_modules 中
3.在工程代碼中執行指令:npm install mysql ,那麼‘mysql’ 子產品就會安裝到下面的node_modules (沒有此檔案會自動生成一個)中。
(如下node_modules就是我工程中module的位置,其餘檔案都是各種工程的代碼。)
mysql目錄下有一個 mysql.js 的測試代碼如下:
var mysql = require('mysql');
解釋:
起初我以為要把所有的module 都放在nodejs安裝目錄下的 node_modules 中。如果工程代碼(指自己寫的工程)也放在這,那麼是可以使用的,但是如果nodejs安裝在D盤,而工程代碼在E盤,那麼這個子產品是引用不到的。 C:\Users\SMouse\AppData\Roaming\npm\node-modules路徑也是同理。
node中引用自定義子產品(非核心子產品)時會進行如下三個步驟
1.路徑分析
2.檔案定位
3.編譯執行
而路徑分析是安如下方式進行的:
1)目前目錄下的node_modules目錄,
2)父目錄下的node_modules目錄;
3)父目錄的父目錄下的node_modules目錄;
4)逐級遞歸,直到根目錄下的node_modules目錄。
如果這些目錄中均未找到代碼中所引用的module,那麼就會報出錯誤:Cannot find module 'mysql'