Handlebars.js: Manillar: Se ha denegado el acceso para resolver la propiedad "..." porque no es una "propiedad propia" de su padre.

Creado en 18 ene. 2020  ·  13Comentarios  ·  Fuente: handlebars-lang/handlebars.js

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

  • ¿Qué marco (es decir, 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).
  • Si usa 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.

Comentario más útil

Marcos: 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.

Todos 13 comentarios

Marcos: 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 (o templateOptions ) mencionado en la documentación no se puede usar aquí, porque express-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 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.

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 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.

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

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

rhariraman picture rhariraman  ·  5Comentarios

snimavat picture snimavat  ·  5Comentarios

amirzandi picture amirzandi  ·  7Comentarios

asgraf picture asgraf  ·  5Comentarios

janus-reith picture janus-reith  ·  3Comentarios