仅引用代码的重要部分。
这是节点后端服务器中的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>
答案 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: ...
};