Używam zaplecza Nodejsa z renderowaniem po stronie serwera za pomocą kierownicy. Po odczytaniu doc
tablicy obiektów z kierownicy, która zawiera kluczowe „treść” i „z”. Jednak gdy próbuję użyć #each
pętli do przeszukiwania tablicy obiektów, pojawia się błąd „Kierownica: odmowa dostępu do rozwiązania właściwości„ z ”, ponieważ nie jest to„ własność własna ”jej obiektu nadrzędnego.
Próbowałem console.log () danych, które pobrałem do tablicy dokumentów i wszystko wydaje się w porządku.
Dla niektórych perspektyw jest to zapytanie mangustowe,
dodałem dokument obiektowy jako klucz w argumentach res.render.
Confession.find()
.sort({date: -1})
.then(function(doc){
for(var i=0; i < doc.length; i++){
//Check whether sender is anonymous
if (doc[i].from === "" || doc[i].from == null){
doc[i].from = "Anonymous";
}
//Add an extra JSON Field for formatted date
doc[i].formattedDate = formatTime(doc[i].date);
}
res.render('index', {title: 'Confession Box', success:req.session.success, errors: req.session.errors, confession: doc});
req.session.errors = null;
req.session.success = null;
});
To część pliku .hbs, przez którą próbuję wykonać pętlę:
{{#each confession}}
<div class="uk-card uk-card-default uk-card-body uk-margin uk-align-center uk-width-1-2@m" >
<div class="uk-text-bold">Message: </div>
<div>{{this.content}}</div>
<div>From: {{this.from}}</div>
<div>Posted: {{this.formattedDate}}</div>
</div>
{{/each}}
źródło
Jeśli używasz mangusty, ten problem można rozwiązać za pomocą .lean (), aby uzyskać obiekt json (zamiast mangusty):
źródło
Dzisiaj mam takie samo ostrzeżenie z kierownicy i widok jest pusty. Poniżej znajduje się sposób, w jaki to naprawiłem:
plik users.hbs
Utworzenie całego nowego obiektu o
context
własnych właściwościach, a następnie przekazanie go do funkcji renderowania naprawi problem ...Uwaga:
Gdy nie tworzymy nowego obiektu, łatwo jest przypadkowo ujawnić poufne informacje lub informacje, które mogłyby zagrozić bezpieczeństwu projektu, mapowanie danych zwróconych z bazy danych i przekazywanie tylko tego, co jest potrzebne do widoku, może być dobrą praktyką ...
źródło
„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
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.Twoje zapytanie mangusty
Popraw mnie, jeśli się mylę, ale myślę, że to może zadziałać dla twojego zapytania ...
źródło
spróbuj npm zainstalować kierownicę w wersji 4.5.3
npm install [email protected]
To zadziałało dla mnie
źródło
Począwszy od wersji 4.6.0 Kierownica domyślnie zabrania dostępu do właściwości prototypu i metod obiektu kontekstu. Jest to związane z opisanym tutaj problemem bezpieczeństwa: https://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html
Zobacz https://github.com/wycats/handlebars.js/issues/1642
Jeśli masz pewność, że tylko programiści mają dostęp do szablonów, możesz zezwolić na dostęp prototypowy, instalując następujący pakiet:
Jeśli używasz kierownicy ekspresowej, postępuj następująco:
źródło
W ostatniej wersji Kierownicy nastąpiła przełomowa zmiana, która spowodowała ten błąd.
Możesz po prostu dodać konfiguracje, które sugerują w swojej dokumentacji, jednak pamiętaj, że w zależności od implementacji może to doprowadzić do podatności na ataki XXS i RCE.
https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access
źródło
Utworzenie innego nowego obiektu lub tablicy z danych zwróconych przez
find()
rozwiąże problem. Zobacz poniżej prostą ilustracjęźródło