Desde o Handlebars 4.6.0, os templates não podem mais acessar as propriedades e métodos do protótipo (por padrão). Veja #1633 para discussões, razões e justificativas.
Existem opções de tempo de execução para restaurar e controlar o comportamento antigo (consulte https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access ), mas se você estiver usando uma estrutura do núcleo do Handlebars, pode não estar claro como configurá-los.
Se você receber esta mensagem de erro e adicione um comentário com as seguintes informações
express-hbs
, express-handlebars
) está chamando o Handlebars quando o erro é registrado? (Cole a saída de npm ls handlebars
ou yarn why handlebars
, se não tiver certeza).Handlebars.compile
e a função de modelo resultante diretamente, sua resposta deve estar aqui https://handlebarsjs.com/api-reference/runtime-options.html#options -to-control-prototype-access. Caso a documentação não responda sua pergunta ou você não a entenda, por favor pergunte (aqui) para que a documentação possa ser melhorada.express-handlebars
em conjunto com mongoose
Os modelos do Mongoose são classes e as propriedades não são "propriedades próprias" do objeto pai.
O método mais limpo é certificar-se de que o handlebars-input é um objeto javascript simples e adequado. Isso pode ser feito no Mongoose, chamando toJSON()
ou toObject
app.get('/test', function (_req, res) {
Kitten.find({}).then(kittens => {
res.render('test.hbs', {
kittens: kittens.map(kitten => kitten.toJSON())
})
})
});
Os runtimeOptions
(ou templateOptions
) mencionados na documentação não podem ser usados aqui, porque express-handlebars
não suporta defini-los.
O hack rápido e sujo (que é realmente hacky e eu não proponho que seja), é 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
}));
Por favor, adicione um Rocket-emoji a este comentário se você gostaria de ter um Handlebars.createWithAllowedProtoAccess
ou algo parecido que faça a parte do meio para você.
Estou com esse problema e não sei como consertar, pode me ajudar ?
Alguém sabe me informar como eu conserto esse erro quando vou usar o handlebars ?
Erro:
Pt-Br: handlebars: acesso negado para resolver a propriedade "nome" porque não é uma "propriedade própria" de seu pai.
Você pode adicionar uma opção de tempo de execução para desativar a verificação ou este aviso:
Does anyone know how to report this error when you use the handlebars?
Mistake:
En: handlebars: access denied to resolve the "name" property because it is not your father's "own property".
You can add a runtime option to disable verification or this warning:
O meu esta assim:
const handlebars = require('express-handlebars')
app.engine('handlebars', handlebars({defaultLayout: 'main'}))
app.set('view engine', 'handlebars')
app.get('/pagamento', function(req, res){
Pagamento.findAll().then(function(pagamentos){
res.render('pagamento', {pagamentos: pagamentos})
})
I would like to use the enhancement. En
Gostaria de usar o aprimoramento. Br
Dê uma olhada nisso: https://www.npmjs.com/package/@handlebars/allow -prototype-access
O
runtimeOptions
(outemplateOptions
) mencionado na documentação não pode ser usado aqui, porqueexpress-handlebars
não suporta defini-los.
Como o express-handlebars não permite que você defina essas opções de configuração de tempo de execução, alguém conhece um método para forçar o express-handlebars a usar o guidão 4.5.3?
Você pode usar https://www.npmjs.com/package/@handlebars/allow -prototype-access com express-handlebars
. Ele envolve o modelo compilado para que os parâmetros padrão sejam definidos.
Oi Nils, não estou conseguindo fazer esse pacote funcionar, quando tento executar com esse pacote recebo um "Erro: Módulo "handlebars" não fornece um mecanismo de visualização." erro. Parece que outro usuário está enfrentando um problema semelhante em https://github.com/wycats/handlebars.js/issues/1648 . Postei meus resultados nesse mesmo tópico. Obrigado
@craj1031tx eu respondi em #1648.
Estruturas:
express-handlebars
em conjunto commongoose
Os modelos do Mongoose são classes e as propriedades não são "propriedades próprias" do objeto pai.
O método mais limpo é certificar-se de que o handlebars-input é um objeto javascript simples e adequado. Isso pode ser feito no Mongoose, chamando
toJSON()
outoObject
app.get('/test', function (_req, res) { Kitten.find({}).then(kittens => { res.render('test.hbs', { kittens: kittens.map(kitten => kitten.toJSON()) }) }) });
Os
runtimeOptions
(outemplateOptions
) mencionados na documentação não podem ser usados aqui, porqueexpress-handlebars
não suporta defini-los.O hack rápido e sujo (que é realmente hacky e eu não proponho que seja), é 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 }));
Por favor, adicione um Rocket-emoji a este comentário se você gostaria de ter um
Handlebars.createWithAllowedProtoAccess
ou algo parecido que faça a parte do meio para você.
Valeu cara :)
Eu deixo o foguete lá!
Estou usando Express-Handlebars com Sequelize.
npm ls guidão:
+-- [email protected]
| `-- [email protected]
`-- [email protected]
Saída do console:
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
Vou tentar o seu com sua solução para mangusto
Estruturas:
express-handlebars
em conjunto commongoose
Os modelos do Mongoose são classes e as propriedades não são "propriedades próprias" do objeto pai.
O método mais limpo é certificar-se de que o handlebars-input é um objeto javascript simples e adequado. Isso pode ser feito no Mongoose, chamando
toJSON()
outoObject
app.get('/test', function (_req, res) { Kitten.find({}).then(kittens => { res.render('test.hbs', { kittens: kittens.map(kitten => kitten.toJSON()) }) }) });
Os
runtimeOptions
(outemplateOptions
) mencionados na documentação não podem ser usados aqui, porqueexpress-handlebars
não suporta defini-los.O hack rápido e sujo (que é realmente hacky e eu não proponho que seja), é 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 }));
Por favor, adicione um Rocket-emoji a este comentário se você gostaria de ter um
Handlebars.createWithAllowedProtoAccess
ou algo parecido que faça a parte do meio para você.
Também podemos usar o método lean() como mostrado abaixo
app.get('/test', function (_req, res) { Kitten.find().lean().then(kittens => res.render('test.hbs', { kittens: kittens})); });
Como o express-handlebars não permite que você defina essas opções de configuração de tempo de execução, alguém conhece um método para forçar o express-handlebars a usar o guidão 4.5.3?
Eu criei um PR para permitir a adição de opções de configuração de tempo de execução para express-handlebars. https://github.com/express-handlebars/express-handlebars/pull/53
Comentários muito úteis
Estruturas:
express-handlebars
em conjunto commongoose
Os modelos do Mongoose são classes e as propriedades não são "propriedades próprias" do objeto pai.
O método mais limpo é certificar-se de que o handlebars-input é um objeto javascript simples e adequado. Isso pode ser feito no Mongoose, chamando
toJSON()
outoObject
Os
runtimeOptions
(outemplateOptions
) mencionados na documentação não podem ser usados aqui, porqueexpress-handlebars
não suporta defini-los.O hack rápido e sujo (que é realmente hacky e eu não proponho que seja), é usar
Por favor, adicione um Rocket-emoji a este comentário se você gostaria de ter um
Handlebars.createWithAllowedProtoAccess
ou algo parecido que faça a parte do meio para você.