"Ух ты, это сработало, почему это происходит? Я сейчас использую express -пульки (3.1.0), которые я установил как движок рендеринга в своем приложении express." - Ли Бун Конг 12 января в 14: 13
"Раньше Handlebars позволяли вам получать доступ к методам прототипа и свойствам входного объекта из шаблона ... Многочисленные проблемы безопасности пришли из этого поведения ... В 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
. Ниже вы можете увидеть новый объект, созданный перед передачей его в шаблон Handlebars.
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));
});
Ваш мон goose запрос
Исправьте меня, если я ошибаюсь, но я думаю, что это может сработать по вашему запросу ...
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;
});