簡體   English   中英

module.exports不是nodejs函數

[英]module.exports is not a function nodejs

僅引用代碼的重要部分。 這是我在節點后端服務器中的server.js

//routes
const userapi = require('./api/routes/user');
//models
require('./api/models/userModel');

//use routes
userapi(app);

在我的userapi ,這是我的路線,我稱我的userController

(function () {
    'use strict';

    module.exports = function (app) {
        var userCtrl = require('../controllers/userCtrl');

        app.post('/api/validate_user', function(req, res, next){
            userCtrl.validate_user(req, res);
        });
    }
})();

這是我的userController代碼。 將來,我將編寫一個代碼來處理MongoDB中的所有事務。

'use strict';

var mongoose = require('mongoose'),
    model = mongoose.model('users'),
    brcpyt = require('bcrypt');

module.exports = function() {
    return {

        validate_user: function(req, res) {

            console.log('here');
        }
    }
};

問題是,每次我從前端發出http請求時。 我收到一條錯誤消息,指出userCtrl.validate_user不是一個函數。 我的前端可以訪問'/api/validate_user'的終結點,並且var userCtrl = require('../controllers/userCtrl')是正確的文件路徑,但是每次我將userCtrl到路由時,它都不會給我功能validate_user

validate_user不在列表中

它位於

require給您分配給module.exports的值,因此您的代碼如下:

var userCtrl = function() {
    return {

        validate_user: function(req, res) {

            console.log('here');
        }
    }
};

userCtrl.validate_user(...);

您現在看到錯誤了嗎? userCtrl是一個函數,因此不具有validate_user屬性。

您確實不需要將模塊包裝在IIFE中。 也就是說,您具體看到的問題是因為您的userCtrl模塊正在導出一個函數,該函數在被調用時返回一個對象,該對象將具有validate_user成員-而不是直接導出對象。 嘗試檢查typeof userCtrl的值-它將是function而不是object ,這是您期望的在這里:)

具體來說,以下內容應在不更改userCtrl的情況下起作用:

var userCtrl = require('../controllers/userCtrl')()

注意最后的括號嗎? 這將調用導出的函數,並為您提供一個帶有validate_user方法的對象。 當您要將某些選項傳遞給模塊時,有時會使用此模式,例如工廠模式。 例如,

const userCtrlFactory = require('../controllers/userCtrl') const userCtrl = userCtrlFactory({ option: value })

但是,這不是最好的方法,您將為此使用類。

我建議您從代碼( (function () {})() )中刪除IIFE,並只使用一個頂層module.exports (就像您對userCtrl所做的那樣)會根據對象導出一個對象或一個類。您需要它。 對於userCtrl,只需直接導出對象即可,因為您沒有傳遞選項,或者需要多次“實例化”控制器:

'use strict'; module.exports = { validate_user: ... };

暫無
暫無

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

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