我无法理解导出模块之间的区别,如:
module.exports = {getUserIP:getUserIP}
或者只是声明:
module.exports = {'getUserIP':getUserIP}
并在底部导出:
var mainbody = require('./app.js');//getUserIP is in here.
const gl = require('geoip-lite');
var ax = require('axios');
module.exports.getloc = function getloc(req, ip, property) {
//return location from IP.
if (req) {
var ipGuest = mainbody.getUserIP(req); //HERE
} else {
var ipGuest = ip;
}....
甚至:
module.exports.getUserIP = function getUserIP(req) {
var ip = req.headers['x-forwarded-for'];
return ip;
}
或
class Essai_TemperatureForm(forms.ModelForm):
def clean(self):
if self.has_changed() and self.initial:
raise ValidationError(
'You cannot change this inline',
code='Forbidden'
)
return super().clean()
class Meta(object):
model = Essai_Temperature
fields='__all__'
我的问题是:当我从另一个文件调用函数getUserIP时:
{{1}}
我收到一条错误消息: Error Message
但是,当我使用FIRST方法导出函数时:
{{1}}
然后它完美无缺。
有什么区别?
答案 0 :(得分:1)
您展示的所有示例都能正常运行,但它们会产生一些不同的影响。
默认情况下,module.exports
已初始化为空对象。所以,当你做这样的事情时:
module.exports.getUserIP = function() {...}
您正在为module.exports已指向的现有对象分配新属性。此方案的一个优点是您可以以相同的方式轻松添加更多属性。
module.exports.getUserRegion = function() {}
这将为同一个对象添加一个属性,而不会干扰您已添加的第一个属性。
另一方面,所有这些都是相同的:
module.exports = {getUserIP: getUserIP}
module.exports = {'getUserIP':getUserIP}
module.exports = { getUserIP } // ES6 shorthand for the previous syntax
并且,它们最终都得到了相同的结果,但它们都将module.exports替换为一个新的对象,其中包含一个新属性。
如果您之后尝试添加其他属性:
module.exports = {getUserRegion};
这将再次为module.exports
分配一个全新的对象,你可能刚刚删除了之前有getUserIP
的对象。分配新对象时,通常会分配一个包含所有属性的对象:
module.exports = {getUserIP: function() {...}, getUserRegion: function() {...}};
因此,不要擦掉你已放在那里的东西。
只要您没有用新对象覆盖module.exports
并因此覆盖已经拥有某些方法的对象,您的所有方案都应该正常工作。
答案 1 :(得分:0)
更好的方法是使用
module.exports = { getUserIP: getUserIP }
通过这种方式,您只需查看文件末尾的export语句,并了解从特定文件导出的函数
module.exports = {getUserIP};
只不过是上述语法的简写(ES6 Magic)。它的典型作用是允许你以这样的方式编写{ getUserIP }
如果键名与函数/变量名相同,如{ getUserIP: getUserIP }
,其中getUserIP
可以是变量或函数或ES6类。
答案 2 :(得分:0)
要理解这个导出模块的概念,只需认为module.export是一个简单的对象。您可以像处理普通的javascript对象一样将任何内容绑定到该对象。
最后,当您通过require('path to js')
需要该模块时,您将获得该导出的对象。如果导出模块中的项目数,则可以通过提供标记的名称将其返回。