Node.js에서 파일간에 변수를 공유 하시겠습니까?


126

다음은 2 개의 파일입니다.

// main.js
require('./modules');
console.log(name); // prints "foobar"

// module.js
name = "foobar";

"var"이 없으면 작동합니다. 그러나 내가 가질 때 :

// module.js
var name = "foobar";

이름은 main.js에서 정의되지 않습니다.

전역 변수가 나쁘다는 말을 들었으며 참조 전에 "var"을 사용하는 것이 좋습니다. 그러나 이것이 전역 변수가 좋은 경우입니까?

답변:


184

전역 변수는 거의 좋은 일이 아닙니다 (예외로는 예외가 될 수도 있습니다 ...). 이 경우 실제로 "name"변수를 내보내려는 것처럼 보입니다. 예 :

// module.js
var name = "foobar";
// export it
exports.name = name;

그런 다음 main.js에서 ...

//main.js
// get a reference to your required module
var myModule = require('./module');

// name is a member of myModule due to the export above
var name = myModule.name;

1
전역 변수는 나쁘다-나는 그것에 완전히 동의한다. 그러나 모듈에 변수에 대한 종속성이있을 수 있습니다. require 함수를 통해이 변수를 다른 js 파일에 전달하는 방법이 있습니까?
appsthat Matter

1
@ jjoe64 무슨 뜻인지 잘 모르겠습니다. exports객체를 통해 원하는 값을 효과적으로 공유 할 수 있습니다 .
jmar777

7
OP는 변수를 main.js에서 정의한 다음 module.js에서 사용할 수 있는지 묻습니다. 반복해서 사용되는 경로를 정의 해야하는 것과 동일한 요구 사항이 있습니다.
designermonkey

4
@Designermonkey이 경우 아마도 주어진 파일에 require () 될 수있는 유형의 값을 가진 구성 객체를 갖는 것이 좋습니다. 당신이주의 만 할 global.foo = 'bar'다음 액세스 foo어디서나 당신이 좋아하는 것 ...하지만 난입니다 내 원래의 대답에 말했듯이 거의 좋은 일 않았다.
jmar777

그것에 대해 감사합니다, 나는 그것을하는 방법을 알아 냈고 그것은 대우를합니다. 내가 올바른 아이디어를 가지고 있음
designermonkey

37

글로벌 var이 최선의 선택 인 시나리오를 찾을 수는 없지만 물론 선택할 수는 있지만이 예제를 살펴보면 동일한 방법을 수행하는 더 좋은 방법을 찾을 수 있습니다.

시나리오 1 : 구성 파일에 내용 저장

애플리케이션 전체에서 동일한 값이 필요하지만 환경 (프로덕션, 개발자 또는 테스트), 예를 들어 메일러 유형에 따라 변경됩니다.

// File: config/environments/production.json
{
    "mailerType": "SMTP",
    "mailerConfig": {
      "service": "Gmail",
      ....
}

// File: config/environments/test.json
{
    "mailerType": "Stub",
    "mailerConfig": {
      "error": false
    }
}

(개발자에게도 비슷한 설정을하십시오)

어떤 구성을로드할지 결정하려면 기본 구성 파일을 만듭니다 (이 파일은 응용 프로그램 전체에서 사용됨)

// File: config/config.js
var _ = require('underscore');

module.exports = _.extend(
    require(__dirname + '/../config/environments/' + process.env.NODE_ENV + '.json') || {});

그리고 지금 당신은 데이터를 얻을 수있는 이 같은를 :

// File: server.js
...
var config = require('./config/config');
...
mailer.setTransport(nodemailer.createTransport(config.mailerType, config.mailerConfig));

시나리오 2 : 상수 파일 사용

// File: constants.js
module.exports = {
  appName: 'My neat app',
  currentAPIVersion: 3
};

그리고 이런 식으로 사용하십시오

// File: config/routes.js

var constants = require('../constants');

module.exports = function(app, passport, auth) {
  var apiroot = '/api/v' + constants.currentAPIVersion;
...
  app.post(apiroot + '/users', users.create);
...

시나리오 3 : 헬퍼 기능을 사용하여 데이터 가져 오기 / 설정

이것의 열렬한 팬은 아니지만 최소한 '이름'(OP의 예를 인용)의 사용을 추적하고 유효성 검사를 할 수 있습니다.

// File: helpers/nameHelper.js

var _name = 'I shall not be null'

exports.getName = function() {
  return _name;
};

exports.setName = function(name) {
  //validate the name...
  _name = name;
};

그리고 그것을 사용하십시오

// File: controllers/users.js

var nameHelper = require('../helpers/nameHelper.js');

exports.create = function(req, res, next) {
  var user = new User();
  user.name = req.body.name || nameHelper.getName();
  ...

global 이외의 다른 솔루션이 없을 경우 유스 케이스가있을 var수 있지만 node.js를 사용하기 시작한 경우 일반적으로 다음 시나리오 중 하나를 사용하여 앱에서 데이터를 공유 할 수 있습니다. 데이터를 처리하는 방식을 정리하면 정말 어려워 질 수 있습니다.


시나리오 2가 마음에 들었지만 빌드 후 대화 한 후에이 값을 변경할 수 있습니까? 우리가 가장 자주하는 것처럼 npm run build. 아니면 빌드 후 값을 변경할 수있는 방법을 알고 있습니까?
카시 울라

@KashifUllah 제공된 정보로 귀하의 의견에 답변 할 수 있는지 확실하지 않은 경우, 사이트에 새로운 질문을 추가 할 수도 있습니다
Felipe Pereira

16

여러 변수를 공유 해야하는 경우 아래 형식을 사용하십시오

//module.js
   let name='foobar';
   let city='xyz';
   let company='companyName';

   module.exports={
    name,
    city,
    company
  }

용법

  // main.js
    require('./modules');
    console.log(name); // print 'foobar'

2
첫 번째 지점에서 발생할 수있는 혼란을 피하기위한 간단한 참고 사항 : module.exports를 사용해야합니다! 귀하의 js 파일이 무엇이든 (예 : global.js). 모듈은 전역 범위에 존재하는 노드 객체입니다! [global.js에서 우리는 module.exports = .....를 사용합니다]
Mohamed Allal

'let'을 제거하면 성공할 것이며 "module.exports."가 필요하지 않습니다.
Ahmad Zahabi

6

하나의 객체로 공유하려는 변수를 저장하십시오. 그런 다음 객체 참조를 통해 변수에 액세스 할 수 있도록로드 된 모듈로 전달하십시오.

// main.js
var myModule = require('./module.js');
var shares = {value:123};

// Initialize module and pass the shareable object
myModule.init(shares);

// The value was changed from init2 on the other file
console.log(shares.value); // 789

다른 파일에서 ..

// module.js
var shared = null;

function init2(){
    console.log(shared.value); // 123
    shared.value = 789;
}

module.exports = {
    init:function(obj){
        // Save the shared object on current module
        shared = obj;

        // Call something outside
        init2();
    }
}

1

var 키워드를 사용하거나 사용하지 않고 선언 된 변수가 전역 객체에 연결되었습니다. 이는 var 키워드없이 변수를 선언하여 Node에서 전역 변수를 작성하는 기초입니다. var 키워드로 선언 된 변수는 모듈에 대해 로컬로 유지됩니다.

자세한 내용은이 기사를 참조하십시오-https: //www.hacksparrow.com/global-variables-in-node-js.html


3
이 조각들이 모순됩니까? 1) "var 키워드를 사용하거나 사용하지 않고 선언 된 변수가 전역 객체에 연결되었습니다." 2) "var 키워드로 선언 된 변수는 모듈에 대해 로컬로 유지됩니다."
BaldEagle

1

다른 의견 global으로는 코드를에 게시하려는 경우 변수가 최선의 선택 이라고 생각합니다 npm. cuz 모든 패키지가 동일한 릴리스의 코드를 사용하고 있는지 확신 할 수는 없습니다. 따라서 파일을 singleton객체 내보내기에 사용하면 여기에서 문제가 발생합니다.

당신이 선택할 수 있습니다 global, require.main또는 파일 공유되는 다른 객체.

더 나은 해결책이 있는지 알려주십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.