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

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

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

// module.js
name = "foobar";

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

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

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

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



답변

전역 변수는 거의 좋은 일이 아닙니다 (예외로는 예외가 될 수도 있습니다 …). 이 경우 실제로 “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;


답변

글로벌 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를 사용하기 시작한 경우 일반적으로 다음 시나리오 중 하나를 사용하여 앱에서 데이터를 공유 할 수 있습니다. 데이터를 처리하는 방식을 정리하면 정말 어려워 질 수 있습니다.


답변

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

//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'


답변

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

// 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();
    }
}


답변

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

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


답변

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

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

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


답변