Handlebars.js: Handlebars: O acesso foi negado para resolver a propriedade "..." porque não é uma "propriedade própria" de seu pai.

Criado em 18 jan. 2020  ·  13Comentários  ·  Fonte: handlebars-lang/handlebars.js

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

  • Qual estrutura (ou seja 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).
  • Se você usar 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.

Comentários muito úteis

Estruturas: 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ê.

Todos 13 comentários

Estruturas: 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 (ou templateOptions ) mencionado na documentação não pode ser usado aqui, porque express-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 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ê.

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

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

Esta página foi útil?
0 / 5 - 0 avaliações