programing

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

abcjava 2023. 8. 29. 20:06
반응형

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

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

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

// module.js
name = "foobar";

"var"가 없으면 작동합니다.하지만 내가 가지고 있는 것은:

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

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

글로벌 변수가 나쁘다고 들었는데, 참조 앞에 "var"를 사용하는 것이 좋습니다.하지만 이것이 글로벌 변수가 좋은 경우일까요?

글로벌 변수는 거의 절대 좋은 것이 아닙니다(예외 한두 개일 수도 있습니다).이 경우에는 "이름" 변수를 내보내고 싶은 것처럼 보입니다.예.,

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

그럼, 주로.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
    }
}

(dev에 대해서도 유사한 구성 만들기)

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

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

글로벌 솔루션 외에 다른 솔루션이 없는 경우 사용 사례가 있을 수 있습니다.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 키워드 없이 변수를 선언하여 노드에 전역 변수를 생성하는 기준이 됩니다.var 키워드로 선언된 변수는 모듈에 로컬로 유지됩니다.

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

새로운 접근법은 아니지만 약간 최적화되었습니다.을 생성하여 할 수 .export그리고.require이 예제에서는 Getter와 Setter가 더 동적이며 전역 변수는 읽기 전용일 수 있습니다.더 글로벌을 더많은글을정다추다니가합음에에 .globals물건.

global.js

const globals = {
  myGlobal: {
    value: 'can be anytype: String, Array, Object, ...'
  },
  aReadonlyGlobal: {
    value: 'this value is readonly',
    protected: true
  },
  dbConnection: {
    value: 'mongoClient.db("database")'
  },
  myHelperFunction: {
    value: function() { console.log('do help') }
  },
}

exports.get = function(global) {
  // return variable or false if not exists
  return globals[global] && globals[global].value ? globals[global].value : false;
};

exports.set = function(global, value) {
  // exists and is protected: return false
  if (globals[global] && globals[global].protected && globals[global].protected === true)
    return false;
  // set global and return true
  globals[global] = { value: value };
  return true;
};

any-other-file.js에서 가져와 설정하는 예제

const globals = require('./globals');

console.log(globals.get('myGlobal'));
// output: can be anytype: String, Array, Object, ...

globals.get('myHelperFunction')();
// output: do help

let myHelperFunction = globals.get('myHelperFunction');
myHelperFunction();
// output: do help

console.log(globals.set('myGlobal', 'my new value'));
// output: true
console.log(globals.get('myGlobal'));
// output: my new value

console.log(globals.set('aReadonlyGlobal', 'this shall not work'));
// output: false
console.log(globals.get('aReadonlyGlobal'));
// output: this value is readonly

console.log(globals.get('notExistingGlobal'));
// output: false

다른 의견으로, 제 생각에는.global당신이 코드를 게시할 경우 변수가 가장 좋은 선택일 수 있습니다.npm모든 패키지가 코드의 동일한 릴리스를 사용하는지 확인할 수 없기 때문입니다.그래서 만약 당신이 파일을 내보내기 위해 사용한다면,singleton개체, 여기서 문제가 발생합니다.

당신은 수있다니습할선택을 선택할 수 .global,require.main또는 파일 간에 공유되는 다른 개체.

그렇지 않으면 패키지를 선택적 종속 패키지로 설치하면 이 문제를 방지할 수 있습니다.

더 좋은 해결책이 있으면 알려주세요.

노드 , "Parcel.js" (Parcel.js)에서 할 수 .window객체, 그리고 그것들은 글로벌 변수는 다음과 같습니다.

window.variableToMakeGlobal = value;

그런 다음 모든 모듈(그리고 더 일반적으로 Javascript 컨텍스트)에서 이 변수에 액세스할 수 있습니다.

언급URL : https://stackoverflow.com/questions/3922994/share-variables-between-files-in-node-js

반응형