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
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).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.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
(odertemplateOptions
) können hier nicht verwendet werden, daexpress-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 mitmongoose
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()
odertoObject
erfolgenapp.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
(odertemplateOptions
) können hier nicht verwendet werden, daexpress-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 mitmongoose
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()
odertoObject
erfolgenapp.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
(odertemplateOptions
) können hier nicht verwendet werden, daexpress-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
Hilfreichster Kommentar
Frameworks:
express-handlebars
in Verbindung mitmongoose
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()
odertoObject
erfolgenDie in der Dokumentation erwähnten
runtimeOptions
(odertemplateOptions
) können hier nicht verwendet werden, daexpress-handlebars
ihre Einstellung nicht unterstützt.Der Quick-and-Dirty-Hack (der wirklich hacky ist und ich nicht vorschlage) ist zu verwenden
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.