"Нічого це не спрацювало. Чому це все-таки відбувається? Зараз я використовую експрес-ручки (3.1.0), які я встановив як двигун візуалізації у своєму експрес-додатку." - Лі Бун Конг 12 січня о 14:13
"У минулому рульові панелі дозволяли б отримати доступ до методів прототипу та властивостей вхідного об'єкта з шаблону ... Від такої поведінки виникло декілька проблем із безпекою ... У handlebars@^4.6.0. Доступ до прототипу об'єкта має Якщо ви користуєтеся спеціальними класами в якості введення в руль, ваш код більше не працюватиме ... Цей пакет автоматично додає параметри виконання під час кожного виклику шаблону, відключаючи обмеження безпеки ... Якщо ваші користувачі пишуть шаблони, і ви виконуєте їх на своєму сервері, НЕ слід використовувати цей пакет, а шукати інші способи вирішення проблеми ...Я пропоную вам перетворити свої екземпляри класу в звичайні об’єкти JavaScript, перш ніж передати їх у функцію шаблону. Кожна власність або функція, до якої ви отримуєте доступ, повинна бути "власною властивістю" свого батьківського ". - README
Детальніше тут:
https://www.npmjs.com/package/@handlebars/allow-prototype-access
МЕТОД ШВИДКОГО І БЕЗПЕЧНОГО ЗАБЕЗПЕЧЕННЯ
Використання ( express-handlebars
і mongoose
):
express-handlebars
не дозволяє вказати параметри виконання для переходу до функції шаблону. Цей пакет може допомогти вам відключити перевірку прототипу для своїх моделей.
Msgstr "Зробіть це, лише якщо ви повністю контролюєте шаблони, які виконуються на сервері."
Кроки:
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, до шаблону Рулевих панелей, складіть його на новий об’єкт із кожним властивістю або функцією, до якої потрібно отримати доступ у своєму .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;
});