[英]require and module.exports : TypeError: X is not a function
server
├── controllers
│ ├── locationsController.js
│ ├── mainController.js
│ └── utilisateursController.js
├── models
│ ├── Locations.js
│ ├── Utilisateurs.js
| └── ...
├── routes.js
└── server.js
在mainController
我有一個函數isValid
來檢查一個字符串,我把它放在那里是因為我想從utilisateursController.js
和locationsController.js
訪問它。 我將其導出如下:
mainController.js
const lc = require('./locationsController');
const uc = require('./utilisateursController');
// ...
module.exports = {
// Associate all models
associateAll: function () {
lc.associateLocations();
uc.associateUtilisateurs();
},
isValid: function(...fields) {
for (let i = 0; i < fields.length; i++)
if (fields[i] === undefined || fields[i] === null || fields[i] === '')
return false;
return true;
}
};
我可以從utilisateursController.js
訪問函數isValid
,但是當我嘗試從locationsController.js
執行相同操作時,出現以下錯誤:
(node:6461) UnhandledPromiseRejectionWarning: TypeError: mc.isValid is not a function
at exports.getAllTasks (.../server/controllers/locationsController.js:30:11)
utilisateursController.js
從這個文件,我可以完美地訪問isValid
,沒有錯誤。
const mc = require('./mainController');
// ...
exports.login = async function (req, res) {
let response = {
// ...
}
if (req.query == null) {
response.infoMsg = 'Query empty...';
res.send(response);
return;
}
const usernameInput = req.query.username;
const passwordInput = req.query.password;
if (!mc.isValid(usernameInput, passwordInput)) {
response.infoMsg = 'username or password is empty...'
res.send(response);
return;
}
// ...
}
locationsController.js
從這個文件中,我得到了上面提到的錯誤,我真的不知道為什么......
const mc = require('./mainController');
// ...
exports.getAllTasks = async function (req, res) {
let response = {
// ...
}
const usernameInput = req.params.username;
if (!mc.isValid(usernameInput)) {
response.infoMsg = 'No parameters given...';
res.send(response);
return;
}
// ...
}
我想這可能是因為需要的決議的順序......
utilisateursController.js
locationsController.js
我真的不知道是什么導致了這個問題......
問題是由於您在mainController
、 utilisateursController
和locationsController
之間存在循環關系。 utilisateursController
和locationsController
都需要mainController
, mainContoller
需要utilisateursController
和locationsController
。 因此,Node.js 的 CommonsJS 樣式模塊解析最終會在至少一個(可能兩個)模塊中運行頂級代碼,並帶有一個占位符對象,用於導出其他模塊之一。 (顯然,在您的情況下, locationsController
為mainController
的導出獲取了一個占位符utilisateursController
可能也有,但不會嘗試在頂層使用它。)
如果您避免在頂層使用mc
,而只在稍后調用的函數中使用它,那么該占位符將在您需要之前被填充,一切都會好起來的。 您引用的代碼似乎只在函數中使用mc
,但考慮到您遇到的錯誤,顯然您的真實代碼並非如此。
附注:這不會與本地JavaScript模塊發生(通常被稱為“ESM”為“E CMA小號CRIPT中號odules),因為即使有循環依賴,頂層模塊代碼進行之前,他們正在解決。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.