좋습니다. 저는 Jekyll을 사용하여 블로그를 만들었 _config.yml
으며 모든 템플릿 / 레이아웃에서 액세스 할 수 있는 파일에 변수를 정의 할 수 있습니다. 저는 현재 Node.JS / Express 를 EJS 템플릿 및 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.locals
과 res.locals
함께 있다는 것입니다 app.locals
변수 하나의 시간을 설정하고 응용 프로그램의 수명이 다할 때까지 유지됩니다. res.locals
미들웨어에서 로컬을 설정하면 요청을받을 때마다 설정됩니다. app.locals
값 req
이 미들웨어에 전달 된 요청 변수 에 의존하지 않는 한 기본적으로 전역 설정을 선호해야합니다 . 값이 변경되지 않으면에서 한 번만 설정하는 것이 더 효율적입니다 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.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>
도움이되기를 바랍니다.
