다음은 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
또는 파일 공유되는 다른 객체.
더 나은 해결책이 있는지 알려주십시오.