„Wow, to zadziałało, dlaczego tak się dzieje? Obecnie używam kierownicy ekspresowej (3.1.0), którą ustawiłem jako silnik renderowania w mojej aplikacji ekspresowej”. - Lee Boon Kong 12 stycznia o 14:13
„W przeszłości kierownica umożliwiała dostęp do metod prototypowych i właściwości obiektu wejściowego z szablonu ... Z tego zachowania wynikało wiele problemów bezpieczeństwa ... W kierownicy@^4.6.0 dostęp do prototypu obiektu ma został całkowicie wyłączony. Teraz, jeśli użyjesz niestandardowych klas jako danych wejściowych do Kierownicy, Twój kod nie będzie już działał ... Ten pakiet automatycznie dodaje opcje środowiska wykonawczego do każdego wywołania szablonu, wyłączając ograniczenia bezpieczeństwa ... Jeśli użytkownicy piszą szablony i wykonujesz je na swoim serwerze, NIE powinieneś używać tego pakietu, ale raczej znaleźć inne sposoby rozwiązania problemu ...Sugeruję konwersję instancji klasy na zwykłe obiekty JavaScript przed przekazaniem ich do funkcji szablonu. Każda właściwość lub funkcja, do której masz dostęp, musi być „własną własnością” jej rodzica. ”- README
Więcej informacji tutaj:
https://www.npmjs.com/package/@handlebars/allow-prototype-access
SZYBKA I BRUDNA METODA BEZPIECZEŃSTWA
Zastosowanie ( express-handlebars
i mongoose
):
express-handlebars
nie pozwala określić opcji środowiska wykonawczego, które mają zostać przekazane do funkcji szablonu. Ten pakiet może pomóc w wyłączeniu kontroli prototypów dla twoich modeli.
„Zrób to tylko, jeśli masz pełną kontrolę nad szablonami wykonywanymi na serwerze”.
Kroki:
1 - Zainstaluj zależność
npm i @handlebars/allow-prototype-access
2 - Użyj tego fragmentu kodu jako przykładu do przepisania serwera ekspresowego
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 - Uruchom serwer i wykonuj swój szczęśliwy taniec.
DŁUŻSZA WIĘCEJ BEZPIECZNA METODA
Przed przekazaniem obiektu zwróconego przez wywołanie AJAX do szablonu Kierownicy zamapuj go na nowy obiekt z każdą właściwością lub funkcją, do której chcesz uzyskać dostęp w .hbs
pliku. Poniżej możesz zobaczyć nowy obiekt wykonany przed przekazaniem go do szablonu Kierownicy.
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));
});
Twoje zapytanie mangusty
Popraw mnie, jeśli się mylę, ale myślę, że to może zadziałać dla twojego zapytania ...
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;
});