«Да, это сработало. Почему это происходит? Я сейчас использую экспресс-рули (3.1.0), которые я установил в качестве механизма рендеринга в своем экспресс-приложении». - Ли Бун Конг 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 - Используйте этот фрагмент в качестве примера, чтобы переписать ваш экспресс-сервер
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));
});
Ваш запрос мангуста
Поправьте меня, если я ошибаюсь, но я думаю, что это может сработать для вашего запроса ...
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;
});