NodeJS需要模块,module.exports.X vs module.exports = {x}

时间:2017-10-11 05:36:43

标签: node.js require

我无法理解导出模块之间的区别,如:

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}}

然后它完美无缺。

有什么区别?

3 个答案:

答案 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')需要该模块时,您将获得该导出的对象。如果导出模块中的项目数,则可以通过提供标记的名称将其返回。