"이제 효과가 있었는데 왜 이런 일이 발생합니까? 저는 현재 Express 앱에서 렌더 엔진으로 설정 한 express-handlebars (3.1.0)를 사용하고 있습니다." –이 분 홍콩 1 월 12 일 14:13
"과거에 핸들 바를 사용하면 템플릿에서 입력 객체의 프로토 타입 방법 및 속성에 액세스 할 수있었습니다.이 동작으로 인해 여러 가지 보안 문제가 발생했습니다. handlebars@^4.6.0에서 객체 프로토 타입에 대한 액세스 권한은 다음과 같습니다. 이제 사용자 정의 클래스를 Handlebars에 대한 입력으로 사용하면 코드가 더 이상 작동하지 않습니다 ...이 패키지는 각 템플릿 호출에 런타임 옵션을 자동으로 추가하여 보안 제한을 비활성화합니다 ... 사용자가 작성중인 경우 템플릿을 서버에서 실행하면이 패키지를 사용하지 말고 문제를 해결할 수있는 다른 방법을 찾으십시오 ...클래스 인스턴스를 템플릿 함수로 전달하기 전에 일반 JavaScript 객체로 변환하는 것이 좋습니다. 액세스하는 모든 속성 또는 기능은 해당 부모의 "자체 속성"이어야합니다. "– README
자세한 내용은 여기 :
https://www.npmjs.com/package/@handlebars/allow-prototype-access
신속하고 더러운 검사 방법
사용법 ( express-handlebars
및 mongoose
) :
express-handlebars
템플릿 기능에 전달할 런타임 옵션을 지정할 수 없습니다. 이 패키지를 사용하면 모델의 프로토 타입 검사를 비활성화 할 수 있습니다.
"서버에서 실행되는 템플릿을 완전히 제어 할 수있는 경우에만이 작업을 수행하십시오."
단계 :
1-설치 종속성
npm i @handlebars/allow-prototype-access
2-이 스 니펫을 예로 사용하여 Express 서버를 다시 작성하십시오.
const express = require('express');
const mongoose = require('mongoose');
const Handlebars = require('handlebars');
const exphbs = require('express-handlebars');
// Import function exported by newly installed node modules.
const { allowInsecurePrototypeAccess } = require('@handlebars/allow-prototype->access');
const PORT = process.env.PORT || 3000;
const app = express();
const routes = require('./routes');
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(express.static('public'));
// When connecting Handlebars to the Express app...
app.engine('handlebars', exphbs({
defaultLayout: 'main',
// ...implement newly added insecure prototype access
handlebars: allowInsecurePrototypeAccess(Handlebars)
})
);
app.set('view engine', 'handlebars');
app.use(routes);
const MONGODB_URI = process.env.MONGODB_URI || >'mongodb://localhost/dbName';
mongoose.connect(MONGODB_URI);
app.listen(PORT, function () {
console.log('Listening on port: ' + PORT);
});
3-서버를 실행하고 행복한 춤을 추십시오.
더 안전한 방법
AJAX 호출에서 반환 된 객체를 Handlebars 템플릿으로 전달하기 전에 .hbs
파일 에서 액세스해야하는 각 속성 또는 함수를 사용하여 새 객체에 매핑 하십시오. 아래에서 핸들 바 템플릿으로 전달하기 전에 만들어진 새 오브젝트를 볼 수 있습니다.
const router = require("express").Router();
const db = require("../../models");
router.get("/", function (req, res) {
db.Article.find({ saved: false })
.sort({ date: -1 })
.then(oldArticleObject => {
const newArticleObject = {
articles: oldArticleObject.map(data => {
return {
headline: data.headline,
summary: data.summary,
url: data.url,
date: data.date,
saved: data.saved
}
})
}
res.render("home", {
articles: newArticleObject.articles
})
})
.catch(error => res.status(500).send(error));
});
몽구스 쿼리
내가 틀렸다면 정정하지만 이것이 귀하의 쿼리에 효과가 있다고 생각합니다 ...
Confession.find()
.sort({ date: -1 })
.then(function (oldDoc) {
for (var i = 0; i < oldDoc.length; i++) {
//Check whether sender is anonymous
if (oldDoc[i].from === "" || oldDoc[i].from == null) {
oldDoc[i].from = "Anonymous";
}
//Add an extra JSON Field for formatted date
oldDoc[i].formattedDate = formatTime(oldDoc[i].date);
}
const newDoc = {
doc: oldDoc.map(function (data) {
return {
from: data.from,
formattedDate: data.formattedDate
}
})
}
res.render('index', { title: 'Confession Box', success: req.session.success, errors: req.session.errors, confession: newDoc.doc });
req.session.errors = null;
req.session.success = null;
});