Desde Handlebars 4.6.0, las plantillas ya no pueden acceder a las propiedades y métodos del prototipo (de forma predeterminada). Ver #1633 para discusiones, razones y justificaciones.
Hay opciones de tiempo de ejecución para restaurar y controlar el comportamiento anterior (consulte https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access), pero si está utilizando un marco en su lugar del núcleo del manillar, puede que no esté claro cómo configurarlos.
Si recibe este mensaje de error, agregue un comentario con la siguiente información
express-hbs
, express-handlebars
) está llamando a Handlebars cuando se registra el error? (Pegue la salida de npm ls handlebars
o yarn why handlebars
, si no está seguro).Handlebars.compile
y la función de plantilla resultante directamente, su respuesta debe estar aquí https://handlebarsjs.com/api-reference/runtime-options.html#options -to-control-prototype-access. Si la documentación no responde a su pregunta o no la entiende, pregunte (aquí) para que se pueda mejorar la documentación.express-handlebars
junto con mongoose
Los modelos de Mongoose son clases y las propiedades no son "propiedades propias" del objeto principal.
El método más limpio es asegurarse de que la entrada del manillar sea un objeto javascript simple y adecuado. Esto se puede hacer en Mongoose, llamando a toJSON()
o toObject
app.get('/test', function (_req, res) {
Kitten.find({}).then(kittens => {
res.render('test.hbs', {
kittens: kittens.map(kitten => kitten.toJSON())
})
})
});
Los runtimeOptions
(o templateOptions
) mencionados en la documentación no se pueden usar aquí, porque express-handlebars
no admite configurarlos.
El truco rápido y sucio (que es realmente hacky y no propongo que lo sea), es usar
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
}));
Agregue un Rocket-emoji a este comentario si desea tener un Handlebars.createWithAllowedProtoAccess
o algo así que haga la parte media por usted.
Tengo este problema y no se como solucionarlo, me pueden ayudar?
¿Alguien puede decirme cómo soluciono este error cuando uso manubrios?
Error:
En-US: handlebars: acceso denegado para resolver la propiedad "nombre" porque no es una "propiedad propia" de su padre.
Puede agregar una opción de tiempo de ejecución para deshabilitar la verificación o esta advertencia:
Alguien sabe como reportar este error cuando usas el manillar?
Error:
Es: handlebars: acceso denegado para resolver la propiedad "nombre" porque no es la "propiedad propia" de tu padre.
Puede agregar una opción de tiempo de ejecución para deshabilitar la verificación o esta advertencia:
El mío es así:
const handlebars = require('express-handlebars')
app.engine('manillares', manillares({diseño predeterminado: 'principal'}))
app.set('ver motor', 'manillar')
app.get('/pago', function(req, res){
Pago.findAll().then(función(pagos){
res.render('pago', {pagos: pagos})
})
Me gustaría utilizar la mejora. en
Me gustaría utilizar la mejora. hermano
Eche un vistazo a esto: https://www.npmjs.com/package/@handlebars/allow -prototype-access
El
runtimeOptions
(otemplateOptions
) mencionado en la documentación no se puede usar aquí, porqueexpress-handlebars
no admite configurarlos.
Dado que express-handlebars no le permite establecer estas opciones de configuración de tiempo de ejecución, ¿alguien conoce un método para obligar a express-handlebars a usar handlebars 4.5.3?
Puede usar https://www.npmjs.com/package/@handlebars/allow -prototype-access con express-handlebars
. Envuelve la plantilla compilada para que se establezcan los parámetros predeterminados.
Hola, Nils, no puedo hacer que ese paquete funcione, cuando trato de ejecutarlo, recibo un "Error: el módulo "handlebars" no proporciona un motor de vista". error. Parece que otro usuario tiene un problema similar en https://github.com/wycats/handlebars.js/issues/1648 . Publiqué mis resultados en ese mismo hilo. Gracias
@craj1031tx Respondí en el #1648.
Marcos:
express-handlebars
junto conmongoose
Los modelos de Mongoose son clases y las propiedades no son "propiedades propias" del objeto principal.
El método más limpio es asegurarse de que la entrada del manillar sea un objeto javascript simple y adecuado. Esto se puede hacer en Mongoose, llamando a
toJSON()
otoObject
app.get('/test', function (_req, res) { Kitten.find({}).then(kittens => { res.render('test.hbs', { kittens: kittens.map(kitten => kitten.toJSON()) }) }) });
Los
runtimeOptions
(otemplateOptions
) mencionados en la documentación no se pueden usar aquí, porqueexpress-handlebars
no admite configurarlos.El truco rápido y sucio (que es realmente hacky y no propongo que lo sea), es usar
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 }));
Agregue un Rocket-emoji a este comentario si desea tener un
Handlebars.createWithAllowedProtoAccess
o algo así que haga la parte media por usted.
gracias amigo :)
¡Ahí les dejo el cohete!
Estoy usando Express-Handlebars con Sequelize.
manillar npm ls:
+-- [email protected]
| `-- [email protected]
`-- [email protected]
Salida de la consola:
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
Lo intentaré con tu solución para la mangosta.
Marcos:
express-handlebars
junto conmongoose
Los modelos de Mongoose son clases y las propiedades no son "propiedades propias" del objeto principal.
El método más limpio es asegurarse de que la entrada del manillar sea un objeto javascript simple y adecuado. Esto se puede hacer en Mongoose, llamando a
toJSON()
otoObject
app.get('/test', function (_req, res) { Kitten.find({}).then(kittens => { res.render('test.hbs', { kittens: kittens.map(kitten => kitten.toJSON()) }) }) });
Los
runtimeOptions
(otemplateOptions
) mencionados en la documentación no se pueden usar aquí, porqueexpress-handlebars
no admite configurarlos.El truco rápido y sucio (que es realmente hacky y no propongo que lo sea), es usar
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 }));
Agregue un Rocket-emoji a este comentario si desea tener un
Handlebars.createWithAllowedProtoAccess
o algo así que haga la parte media por usted.
También podemos usar el método lean () como se muestra a continuación
app.get('/test', function (_req, res) { Kitten.find().lean().then(kittens => res.render('test.hbs', { kittens: kittens})); });
Dado que express-handlebars no le permite establecer estas opciones de configuración de tiempo de ejecución, ¿alguien conoce un método para obligar a express-handlebars a usar handlebars 4.5.3?
Creé un PR para permitir agregar opciones de configuración de tiempo de ejecución a express-handlebars. https://github.com/express-handlebars/express-handlebars/pull/53
Comentario más útil
Marcos:
express-handlebars
junto conmongoose
Los modelos de Mongoose son clases y las propiedades no son "propiedades propias" del objeto principal.
El método más limpio es asegurarse de que la entrada del manillar sea un objeto javascript simple y adecuado. Esto se puede hacer en Mongoose, llamando a
toJSON()
otoObject
Los
runtimeOptions
(otemplateOptions
) mencionados en la documentación no se pueden usar aquí, porqueexpress-handlebars
no admite configurarlos.El truco rápido y sucio (que es realmente hacky y no propongo que lo sea), es usar
Agregue un Rocket-emoji a este comentario si desea tener un
Handlebars.createWithAllowedProtoAccess
o algo así que haga la parte media por usted.