[node.js] Express / Node.JS를 사용하여 모든보기에서 액세스 할 수있는 전역 변수를 만드는 방법은 무엇입니까?

좋습니다. 저는 Jekyll을 사용하여 블로그를 만들었 _config.yml으며 모든 템플릿 / 레이아웃에서 액세스 할 수 있는 파일에 변수를 정의 할 수 있습니다. 저는 현재 Node.JS / ExpressEJS 템플릿 및 ejs-locals (partials / layouts 용) 와 함께 사용하고 있습니다. 누군가 Jekyll에 익숙한 경우 에있는 전역 변수와 유사한 작업을 수행하려고합니다. 다음과 같은 변수 site.title가 있습니다 _config.yml. 내 모든 페이지에서 동일하게 유지되는 사이트의 제목 (페이지 제목 아님), 작성자 / 회사 이름.

다음은 내가 현재하고있는 작업의 예입니다. :

exports.index = function(req, res){
    res.render('index', {
        siteTitle: 'My Website Title',
        pageTitle: 'The Root Splash Page',
        author: 'Cory Gross',
        description: 'My app description',
        indexSpecificData: someData
    });
};

exports.home = function (req, res) {
    res.render('home', {
        siteTitle: 'My Website Title',
        pageTitle: 'The Home Page',
        author: 'Cory Gross',
        description: 'My app description',
        homeSpecificData: someOtherData
    });
};

내 사이트의 제목, 설명, 작성자 등과 같은 변수를 한 곳에서 정의하고 .NET에 대한 각 호출에 대한 옵션으로 전달할 필요없이 EJS를 통해 내 레이아웃 / 템플릿에서 액세스 할 수 있도록하고 싶습니다 res.render. 이 작업을 수행하고 각 페이지에 특정한 다른 변수를 전달할 수있는 방법이 있습니까?



답변

Express 3 API 참조 를 조금 더 공부 한 후 제가 찾고있는 것을 발견했습니다. 특히 항목에 대한 app.locals다음 조금 더 아래로 res.locals내가 필요한 답변을 보유했습니다.

나는 함수 app.locals가 객체를 취하고 모든 속성을 응용 프로그램 범위의 전역 변수로 저장 한다는 것을 스스로 발견했습니다 . 이러한 전역은 각 뷰에 지역 변수로 전달됩니다. 그러나 함수 res.locals는 요청 범위가 지정되므로 응답 지역 변수는 해당 특정 요청 / 응답 중에 렌더링 된 뷰에서만 액세스 할 수 있습니다.

그래서 내 경우에는 다음을 app.js추가했습니다.

app.locals({
    site: {
        title: 'ExpressBootstrapEJS',
        description: 'A boilerplate for a simple web application with a Node.JS and Express backend, with an EJS template with using Twitter Bootstrap.'
    },
    author: {
        name: 'Cory Gross',
        contact: 'CoryG89@gmail.com'
    }
});

그리고이 모든 변수가 아니라 내보기에 액세스 할 수 있습니다 site.title, site.description, author.name, author.contact.

를 사용하여 요청에 대한 각 응답에 대해 지역 변수를 정의 res.locals하거나 호출 의 options매개 변수 로 페이지 제목과 같은 변수를 간단히 전달할 수도 render있습니다.

편집 : 이 방법 을 사용하면 미들웨어에서 이러한 지역을 사용할 수 없습니다 . Pickels가 아래 의견에서 제안한 것처럼 실제로 이것을 실행했습니다. 이 경우 그의 대안 (및 감사) 답변에서 미들웨어 기능을 만들어야합니다. 미들웨어 함수는 res.locals각 응답에 대해 추가 한 다음 next. 이 미들웨어 기능은 이러한 로컬을 사용해야하는 다른 미들웨어 위에 배치되어야합니다.

편집 : 를 통해 지역 주민을 선언하는 또 다른 차이점 app.localsres.locals함께 있다는 것입니다 app.locals변수 하나의 시간을 설정하고 응용 프로그램의 수명이 다할 때까지 유지됩니다. res.locals미들웨어에서 로컬을 설정하면 요청을받을 때마다 설정됩니다. app.localsreq이 미들웨어에 전달 된 요청 변수 에 의존하지 않는 한 기본적으로 전역 설정을 선호해야합니다 . 값이 변경되지 않으면에서 한 번만 설정하는 것이 더 효율적입니다 app.locals.


답변

일반 미들웨어의 locals 개체에 추가하여이를 수행 할 수 있습니다.

app.use(function (req, res, next) {
   res.locals = {
     siteTitle: "My Website's Title",
     pageTitle: "The Home Page",
     author: "Cory Gross",
     description: "My app's description",
   };
   next();
});

Locals는 또한 locals 객체를 덮어 쓰지 않고 확장하는 함수입니다. 따라서 다음도 작동합니다.

res.locals({
  siteTitle: "My Website's Title",
  pageTitle: "The Home Page",
  author: "Cory Gross",
  description: "My app's description",
});

전체 예

var app = express();

var middleware = {

    render: function (view) {
        return function (req, res, next) {
            res.render(view);
        }
    },

    globalLocals: function (req, res, next) {
        res.locals({
            siteTitle: "My Website's Title",
            pageTitle: "The Root Splash Page",
            author: "Cory Gross",
            description: "My app's description",
        });
        next();
    },

    index: function (req, res, next) {
        res.locals({
            indexSpecificData: someData
        });
        next();
    }

};


app.use(middleware.globalLocals);
app.get('/', middleware.index, middleware.render('home'));
app.get('/products', middleware.products, middleware.render('products'));

또한 일반적인 렌더 미들웨어를 추가했습니다. 이렇게하면 각 경로에 res.render를 추가 할 필요가 없으므로 코드 재사용이 향상됩니다. 재사용 가능한 미들웨어 경로를 따라 가면 개발 속도를 엄청나게 높일 수있는 많은 빌딩 블록이 있음을 알게 될 것입니다.


답변

Express 4.0의 경우 응용 프로그램 수준 변수를 사용하는 것이 약간 다르게 작동하고 Cory의 답변이 작동하지 않는다는 것을 알았습니다.

문서에서 : http://expressjs.com/en/api.html#app.locals

앱에 대한 전역 변수를 선언 할 수 있음을 발견했습니다.

app.locals

예 :

app.locals.baseUrl = "http://www.google.com"

그런 다음 애플리케이션에서 이러한 변수에 액세스 할 수 있으며 익스프레스 미들웨어에서 req 객체에서 다음과 같이 액세스 할 수 있습니다.

req.app.locals.baseUrl

예 :

console.log(req.app.locals.baseUrl)
//prints out http://www.google.com


답변

app.js에서 다음과 같이 추가해야합니다.

global.myvar = 100;

이제이 변수를 사용하려는 모든 파일에서 다음과 같이 액세스 할 수 있습니다. myvar


답변

이 작업을 수행하는 한 가지 방법 app.locals은 해당 앱 의 변수를app.js

다음을 통해 설정

var app = express();
app.locals.appName = "DRC on FHIR";

접근성을 얻다

app.listen(3000, function () {
    console.log('[' + app.locals.appName + '] => app listening on port 3001!');
});

@RamRovi 예제의 스크린 샷을 약간 개선하여 자세히 설명합니다.

여기에 이미지 설명 입력


답변

“글로벌”을 사용할 수도 있습니다.

예:

다음과 같이 선언하십시오.

  app.use(function(req,res,next){
      global.site_url = req.headers.host;   // hostname = 'localhost:8080'
      next();
   });

다음과 같이 사용하십시오.보기 또는 ejs 파일에서 <% console.log (site_url); %>

js 파일 console.log (site_url);


답변

다른 답변으로 “app.locals”에로드 된 외부 파일 JSON을 사용하도록이 코드를 구현했습니다.

매개 변수

{
    "web": {
        "title" : "Le titre de ma Page",
        "cssFile" : "20200608_1018.css"
    }
}

신청

var express     = require('express');
var appli       = express();
var serveur     = require('http').Server(appli);

var myParams    = require('./include/my_params.json');
var myFonctions = require('./include/my_fonctions.js');

appli.locals = myParams;

EJS 페이지

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title><%= web.title %></title>
    <link rel="stylesheet" type="text/css" href="/css/<%= web.cssFile %>">
</head>

</body>
</html>

도움이되기를 바랍니다.