Handlebars.js: Lenker: Der Zugriff zum Auflösen der Eigenschaft "..." wurde verweigert, da es sich nicht um eine "eigene Eigenschaft" des übergeordneten Elements handelt.

Erstellt am 18. Jan. 2020  ·  13Kommentare  ·  Quelle: handlebars-lang/handlebars.js

Seit Handlebars 4.6.0 können Vorlagen (standardmäßig) nicht mehr auf Prototypeigenschaften und -methoden zugreifen. Siehe #1633 für Diskussionen, Gründe und Rechtfertigungen.

Es gibt Laufzeitoptionen, um das alte Verhalten wiederherzustellen und zu steuern (siehe https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access), aber wenn Sie stattdessen ein Framework verwenden des Lenkerkerns, ist es möglicherweise nicht klar, wie sie eingestellt werden sollen.

Wenn Sie diese Fehlermeldung erhalten, fügen Sie bitte einen Kommentar mit den folgenden Informationen hinzu

  • Welches Framework (dh express-hbs , express-handlebars ) ruft Handlebars auf, wenn der Fehler protokolliert wird? (Fügen Sie die Ausgabe von npm ls handlebars oder yarn why handlebars ein, wenn Sie sich nicht sicher sind).
  • Wenn Sie Handlebars.compile und die resultierende Vorlagenfunktion direkt verwenden, sollten Sie hier antworten: https://handlebarsjs.com/api-reference/runtime-options.html#options -to-control-prototype-access. Wenn die Dokumentation Ihre Frage nicht beantwortet oder Sie sie nicht verstehen, fragen Sie bitte (hier), damit die Dokumentation verbessert werden kann.

Hilfreichster Kommentar

Frameworks: express-handlebars in Verbindung mit mongoose

Die Modelle von Mongoose sind Klassen und die Eigenschaften sind keine "eigenen Eigenschaften" des übergeordneten Objekts.

Die sauberste Methode besteht darin, sicherzustellen, dass die Handlebars-Eingabe ein richtiges einfaches JavaScript-Objekt ist. Dies kann in Mongoose durch Aufrufen von toJSON() oder toObject erfolgen

app.get('/test', function (_req, res) {
    Kitten.find({}).then(kittens => {
        res.render('test.hbs', {
            kittens: kittens.map(kitten => kitten.toJSON())
        })
    })
});

Die in der Dokumentation erwähnten runtimeOptions (oder templateOptions ) können hier nicht verwendet werden, da express-handlebars ihre Einstellung nicht unterstützt.

Der Quick-and-Dirty-Hack (der wirklich hacky ist und ich nicht vorschlage) ist zu verwenden

var handlebarsInstance = Handlebars.create();

handlebarsInstance.compile = function (templateStr, compileOptions) {
   // compile template
   // return a function that calls the compiled template with  `allowProtoPropertiesByDefault` and `allowProtoMethodsByDefault` as runtime-options
  // WARNING: People can crash your system by frabricating special templates. Don't use
  // this if your users can create templates. 
}
app.engine('hbs', expressHandlebars({
    handlebars: handlebarsInstance
}));

Bitte fügen Sie diesem Kommentar ein Raketen-Emoji hinzu, wenn Sie gerne ein Handlebars.createWithAllowedProtoAccess oder so etwas haben möchten, das den Mittelteil für Sie erledigt.

Alle 13 Kommentare

Frameworks: express-handlebars in Verbindung mit mongoose

Die Modelle von Mongoose sind Klassen und die Eigenschaften sind keine "eigenen Eigenschaften" des übergeordneten Objekts.

Die sauberste Methode besteht darin, sicherzustellen, dass die Handlebars-Eingabe ein richtiges einfaches JavaScript-Objekt ist. Dies kann in Mongoose durch Aufrufen von toJSON() oder toObject erfolgen

app.get('/test', function (_req, res) {
    Kitten.find({}).then(kittens => {
        res.render('test.hbs', {
            kittens: kittens.map(kitten => kitten.toJSON())
        })
    })
});

Die in der Dokumentation erwähnten runtimeOptions (oder templateOptions ) können hier nicht verwendet werden, da express-handlebars ihre Einstellung nicht unterstützt.

Der Quick-and-Dirty-Hack (der wirklich hacky ist und ich nicht vorschlage) ist zu verwenden

var handlebarsInstance = Handlebars.create();

handlebarsInstance.compile = function (templateStr, compileOptions) {
   // compile template
   // return a function that calls the compiled template with  `allowProtoPropertiesByDefault` and `allowProtoMethodsByDefault` as runtime-options
  // WARNING: People can crash your system by frabricating special templates. Don't use
  // this if your users can create templates. 
}
app.engine('hbs', expressHandlebars({
    handlebars: handlebarsInstance
}));

Bitte fügen Sie diesem Kommentar ein Raketen-Emoji hinzu, wenn Sie gerne ein Handlebars.createWithAllowedProtoAccess oder so etwas haben möchten, das den Mittelteil für Sie erledigt.

Ich habe dieses Problem und weiß nicht, wie ich es beheben kann, können Sie mir helfen?

Kann mir jemand sagen, wie ich diesen Fehler behebe, wenn ich einen Lenker verwende?
Fehler:
En-US: handlebars: Zugriff zum Auflösen der Eigenschaft „Name“ verweigert, da es sich nicht um eine „eigene Eigenschaft“ des übergeordneten Elements handelt.
Sie können eine Laufzeitoption hinzufügen, um die Überprüfung oder diese Warnung zu deaktivieren:

Weiß jemand, wie man diesen Fehler meldet, wenn Sie den Lenker verwenden?
Fehler:
De: Lenker: Zugriff verweigert, um das Eigentum "Name" aufzulösen, da es nicht das "eigene Eigentum" Ihres Vaters ist.

Sie können eine Laufzeitoption hinzufügen, um die Überprüfung oder diese Warnung zu deaktivieren:

Meine ist so:
const handlebars = require('express-lenker')

app.engine('lenker', lenker({defaultLayout: 'main'}))
app.set('View Engine', 'Lenker')

app.get('/payment', function(req, res){
Payment.findAll().then(function(payments){
res.render('Zahlung', {Zahlungen: Zahlungen})
})

Ich möchte die Erweiterung nutzen. in
Ich möchte die Erweiterung nutzen. Br

Schauen Sie sich das an: https://www.npmjs.com/package/@handlebars/allow -prototype-access

Die in der Dokumentation erwähnten runtimeOptions (oder templateOptions ) können hier nicht verwendet werden, da express-handlebars ihre Einstellung nicht unterstützt.

Da Sie mit Express-Handlebars diese Laufzeitkonfigurationsoptionen nicht festlegen können, kennt jemand eine Methode, um Express-Handlebars zu zwingen, Handlebars 4.5.3 zu verwenden?

Sie können https://www.npmjs.com/package/@handlebars/allow -prototype-access mit express-handlebars verwenden. Es umschließt die kompilierte Vorlage, sodass die Standardparameter festgelegt werden.

Hallo Nils, ich kann dieses Paket nicht zum Laufen bringen, wenn ich versuche, mit diesem Paket zu laufen, erhalte ich einen "Fehler: Modul "Handlebars" bietet keine Ansichts-Engine." Error. Es scheint, dass ein anderer Benutzer in https://github.com/wycats/handlebars.js/issues/1648 auf ein ähnliches Problem stößt. Ich habe meine Ergebnisse im selben Thread gepostet. Danke

@craj1031tx Ich habe in #1648 geantwortet.

Frameworks: express-handlebars in Verbindung mit mongoose

Die Modelle von Mongoose sind Klassen und die Eigenschaften sind keine "eigenen Eigenschaften" des übergeordneten Objekts.

Die sauberste Methode besteht darin, sicherzustellen, dass die Handlebars-Eingabe ein richtiges einfaches JavaScript-Objekt ist. Dies kann in Mongoose durch Aufrufen von toJSON() oder toObject erfolgen

app.get('/test', function (_req, res) {
    Kitten.find({}).then(kittens => {
        res.render('test.hbs', {
            kittens: kittens.map(kitten => kitten.toJSON())
        })
    })
});

Die in der Dokumentation erwähnten runtimeOptions (oder templateOptions ) können hier nicht verwendet werden, da express-handlebars ihre Einstellung nicht unterstützt.

Der Quick-and-Dirty-Hack (der wirklich hacky ist und ich nicht vorschlage) ist zu verwenden

var handlebarsInstance = Handlebars.create();

handlebarsInstance.compile = function (templateStr, compileOptions) {
   // compile template
   // return a function that calls the compiled template with  `allowProtoPropertiesByDefault` and `allowProtoMethodsByDefault` as runtime-options
  // WARNING: People can crash your system by frabricating special templates. Don't use
  // this if your users can create templates. 
}
app.engine('hbs', expressHandlebars({
    handlebars: handlebarsInstance
}));

Bitte fügen Sie diesem Kommentar ein Raketen-Emoji hinzu, wenn Sie gerne ein Handlebars.createWithAllowedProtoAccess oder so etwas haben möchten, das den Mittelteil für Sie erledigt.

Danke Alter :)

Ich lasse die Rakete da!

Ich benutze Express-Lenker mit Sequelize.
npm ls lenker:

+-- [email protected]
| `-- [email protected] 
`-- [email protected] 

Konsolenausgabe:

Handlebars: Access has been denied to resolve the property "name" because it is not an "own property" of its parent.
You can add a runtime option to disable the check or this warning:
See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details
Handlebars: Access has been denied to resolve the property "id" because it is not an "own property" of its parent.
You can add a runtime option to disable the check or this warning:
See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details
Handlebars: Access has been denied to resolve the property "email" because it is not an "own property" of its parent.
You can add a runtime option to disable the check or this warning:
See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details
Handlebars: Access has been denied to resolve the property "url" because it is not an "own property" of its parent.
You can add a runtime option to disable the check or this warning:
See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details
Handlebars: Access has been denied to resolve the property "description" because it is not an "own property" of its parent.
You can add a runtime option to disable the check or this warning:
See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details
Handlebars: Access has been denied to resolve the property "createdAt" because it is not an "own property" of its parent.
You can add a runtime option to disable the check or this warning:
See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details
Handlebars: Access has been denied to resolve the property "updatedAt" because it is not an "own property" of its parent.
You can add a runtime option to disable the check or this warning:
See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details

Ich werde es mit Ihrer Lösung für Mungo versuchen

Frameworks: express-handlebars in Verbindung mit mongoose

Die Modelle von Mongoose sind Klassen und die Eigenschaften sind keine "eigenen Eigenschaften" des übergeordneten Objekts.

Die sauberste Methode besteht darin, sicherzustellen, dass die Handlebars-Eingabe ein richtiges einfaches JavaScript-Objekt ist. Dies kann in Mongoose durch Aufrufen von toJSON() oder toObject erfolgen

app.get('/test', function (_req, res) {
    Kitten.find({}).then(kittens => {
        res.render('test.hbs', {
            kittens: kittens.map(kitten => kitten.toJSON())
        })
    })
});

Die in der Dokumentation erwähnten runtimeOptions (oder templateOptions ) können hier nicht verwendet werden, da express-handlebars ihre Einstellung nicht unterstützt.

Der Quick-and-Dirty-Hack (der wirklich hacky ist und ich nicht vorschlage) ist zu verwenden

var handlebarsInstance = Handlebars.create();

handlebarsInstance.compile = function (templateStr, compileOptions) {
   // compile template
   // return a function that calls the compiled template with  `allowProtoPropertiesByDefault` and `allowProtoMethodsByDefault` as runtime-options
  // WARNING: People can crash your system by frabricating special templates. Don't use
  // this if your users can create templates. 
}
app.engine('hbs', expressHandlebars({
    handlebars: handlebarsInstance
}));

Bitte fügen Sie diesem Kommentar ein Raketen-Emoji hinzu, wenn Sie gerne ein Handlebars.createWithAllowedProtoAccess oder so etwas haben möchten, das den Mittelteil für Sie erledigt.

Wir können auch die lean()-Methode verwenden, wie unten gezeigt

 app.get('/test', function (_req, res) {
    Kitten.find().lean().then(kittens => res.render('test.hbs', { kittens: kittens}));
});

Da Sie mit Express-Handlebars diese Laufzeitkonfigurationsoptionen nicht festlegen können, kennt jemand eine Methode, um Express-Handlebars zu zwingen, Handlebars 4.5.3 zu verwenden?

Ich habe eine PR erstellt, um das Hinzufügen von Laufzeitkonfigurationsoptionen zu Express-Lenkern zu ermöglichen. https://github.com/express-handlebars/express-handlebars/pull/53

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen