簡體   English   中英

require 和 module.exports : TypeError: X is not a function

[英]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.jslocationsController.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

地點

我真的不知道是什么導致了這個問題......

問題是由於您在mainControllerutilisateursControllerlocationsController之間存在循環關系。 utilisateursControllerlocationsController都需要mainControllermainContoller需要utilisateursControllerlocationsController 因此,Node.js 的 CommonsJS 樣式模塊解析最終會在至少一個(可能兩個)模塊中運行頂級代碼,並帶有一個占位符對象,用於導出其他模塊之一。 (顯然,在您的情況下, locationsControllermainController的導出獲取了一個占位符utilisateursController可能也有,但不會嘗試在頂層使用它。)

如果您避免在頂層使用mc ,而只在稍后調用的函數中使用它,那么該占位符將在您需要之前被填充,一切都會好起來的。 您引用的代碼似乎只在函數中使用mc ,但考慮到您遇到的錯誤,顯然您的真實代碼並非如此。

更多在Node.js 模塊文檔的“周期”部分


附注:這不會與本地JavaScript模塊發生(通常被稱為“ESM”為“E CMA小號CRIPT中號odules),因為即使有循環依賴,頂層模塊代碼進行之前,他們正在解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM