2017-10-11 1 views
0

나는 문제 같은 수출 모듈 간의 차이를 이해하는 데 :NodeJS, module.exports.X 대 module.exports = {X}

module.exports.getUserIP = function getUserIP(req) { 
    var ip = req.headers['x-forwarded-for']; 
    return ip; 
} 

또는를 그냥 선언 :

function getUserIP(req) { 
    // retrieve user IP from req object 
    // Build this function to be more accurate/use more sources. 
    var ip = req.headers['x-forwarded-for']; 
    return ip; 
} 

과 하단에 수출 :

module.exports = { getUserIP } 

또는 :

module.exports = {getUserIP:getUserIP} 

또는

module.exports = {'getUserIP':getUserIP} 

내 문제는 : 내가 다른 파일에서 함수 getUserIP를 호출 할 때, 그러나 Error Message

:

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

내가 오류 메시지가 FIRST 메서드를 사용하여 함수를 내 보냅니다.

module.exports.getUserIP = function getUserIP(req) { 
    var ip = req.headers['x-forwarded-for']; 
    return ip; 
} 

그럼 완벽하게 작동합니다.

다른 점은 무엇입니까?

+0

app.js에서 여러 유사한 함수를 내보내시겠습니까? 그렇다면 두 번째 방법을 사용하면 매번 내보내기 개체 전체를 덮어 씁니다. – paolord

+0

그렇지 않습니다. 각 파일의 맨 아래에 하나의 module.exports = {} 만 있습니다. 다른 기능은 작동하지만이 기능은 다른 이유로 내 보내지 않습니다. 특별히 module.exports.name = function()을 사용하여 내보내기 만하면됩니다. 작동하지만 코드 하단에 8 개의 클래스를 내보내고 코드에 1 개의 클래스를 내보내는 것이 더러워 보입니다. –

답변

0

더 나은 방법은

module.exports = { getUserIP: getUserIP }

당신이 당신의 파일의 끝에서 수출 문을보고 기능 특정 파일

으로부터 수출되고있는 알 수있는이 방법을 사용하는 것입니다 module.exports = {getUserIP};은 위의 구문 (ES6 Magic)의 약자입니다. 일반적으로 이것은 과 같이 키 이름이 { getUserIP: getUserIP }과 같을 경우 { getUserIP }을 쓸 수 있습니다. 여기서 getUserIP은 변수 또는 함수 또는 ES6 클래스가 될 수 있습니다.

1

표시 한 모든 예는 제대로 작동하지만 몇 가지 다른 영향을 미칩니다.

기본적으로 module.exports은 이미 빈 개체로 초기화됩니다. 당신이 뭔가를 할 때, :

당신은 module.exports 기존 개체에 새로운 속성을 할당하는
module.exports.getUserIP = function() {...} 

이미 지적했다. 이 구성표의 한 가지 장점은 같은 방식으로 더 많은 속성을 쉽게 추가 할 수 있다는 것입니다.

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을 덮어 쓰기 때문에 이미 당신의 방법의 일부를 가지고 객체를 덮어 쓰기하지 않는 한


당신의 계획은 모두 한 잘 작동합니다.

+0

나는 모듈을 덮어 쓰고 있다고 나는 믿지 않는다. 나는 다음과 같은 근본적인 차이점이 있다고 생각한다 : module.exports.functionX = functionX 그리고 module.exports = {functionX, functionY, functionZ} –

+0

@ManojKumar - 원본을 대체하는 것과는 근본적인 차이점이 없다. 'module.exports' 오브젝트를 새롭고 다른 오브젝트로 대체하십시오. 아무도 원래 객체를 사용한 적이 없다면 전혀 문제가되지 않습니다. 어느쪽으로 든 할 수 있습니다. 작동하는 제품과 작동하지 않는 제품이 있다면 문제가되는 제품을 보여주지 않는 제품이 있습니다. 문제를 일으키는 실제 코드 (전체적으로 볼 때)가 필요합니다. – jfriend00

0

이 내보내기 모듈 개념을 이해하려면 module.export가 단순한 객체라고 생각하십시오. 일반 자바 스크립트 객체와 마찬가지로 객체에 아무 것도 바인딩 할 수 없습니다.
마지막으로 해당 모듈을 require('path to js')으로 지정해야 해당 내 보낸 개체를 가져올 수 있습니다. 모듈의 항목 수를 내보내는 경우 태그의 이름을 제공하여 항목을 되돌릴 수 있습니다.