module.exports不是函数nodejs

时间:2018-03-11 03:35:10

标签: javascript node.js

仅引用代码的重要部分。 这是节点后端服务器中的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 < / p>

validate_user is not on the list

its located

2 个答案:

答案 0 :(得分:1)

require为您提供分配给module.exports的值,因此您的代码如下:

var userCtrl = function() {
    return {

        validate_user: function(req, res) {

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

userCtrl.validate_user(...);

你现在看到了这个bug吗? userCtrl是一个函数,因此没有validate_user属性......

答案 1 :(得分:1)

你真的不需要将你的模块包装在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 })

然而,这不是最好的方法,你可以使用类。

我建议您从代码中删除IIFE((function () {})())并且只有一个顶级module.exports(就像您使用userCtrl一样)导出对象或类,具体取决于你需要什么。对于userCtrl,只需直接导出对象,因为您没有传递选项或者需要&#34;实例化&#34;控制器不止一次:

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