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