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
'programing' 카테고리의 다른 글
El Capitan 업그레이드: 라이브러리가 로드되지 않음: /usr/local/lib/libmysqlclient.18.dylib (0) | 2023.08.29 |
---|---|
텍스트 보기에 맞게 텍스트 글꼴 크기를 조정하는 방법 (0) | 2023.08.29 |
PL/SQL 버그입니까? (0) | 2023.08.29 |
olingo v2에서 BLOB와 CLOB를 어떻게 처리합니까? (0) | 2023.08.29 |
ValueError: numpy.ndarray 크기가 변경되었습니다. 이진 비호환성을 나타낼 수 있습니다.C 헤더에서 88이 필요하고 PyObject에서 80이 필요합니다. (0) | 2023.08.29 |