Handlebars.js: Guidon : l'accès a été refusé pour résoudre la propriété "..." car il ne s'agit pas d'une "propriété" de son parent.

Créé le 18 janv. 2020  ·  13Commentaires  ·  Source: handlebars-lang/handlebars.js

Depuis Handlebars 4.6.0, les modèles ne peuvent plus accéder aux propriétés et aux méthodes du prototype (par défaut). Voir #1633 pour les discussions, les raisons et les justifications.

Il existe des options d'exécution pour restaurer et contrôler l'ancien comportement (voir https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access), mais si vous utilisez plutôt un framework du noyau du guidon, il se peut que vous ne sachiez pas comment les régler.

Si vous obtenez ce message d'erreur et veuillez ajouter un commentaire avec les informations suivantes

  • Quel framework (c'est- express-hbs dire express-handlebars ) appelle Handlebars lorsque l'erreur est enregistrée ? (Collez la sortie de npm ls handlebars ou yarn why handlebars , si vous n'êtes pas sûr).
  • Si vous utilisez Handlebars.compile et la fonction de modèle résultante directement, votre réponse devrait être ici https://handlebarsjs.com/api-reference/runtime-options.html#options -to-control-prototype-access. Si la documentation ne répond pas à votre question ou si vous ne la comprenez pas, veuillez demander (ici) afin que la documentation puisse être améliorée.

Commentaire le plus utile

Cadres : express-handlebars en conjonction avec mongoose

Les modèles de Mongoose sont des classes et les propriétés ne sont pas des "propres propriétés" de l'objet parent.

La méthode la plus propre consiste à s'assurer que l'entrée du guidon est un objet javascript simple et approprié. Cela peut être fait dans Mongoose, en appelant toJSON() ou toObject

app.get('/test', function (_req, res) {
    Kitten.find({}).then(kittens => {
        res.render('test.hbs', {
            kittens: kittens.map(kitten => kitten.toJSON())
        })
    })
});

Les runtimeOptions (ou templateOptions ) mentionnés dans la documentation ne peuvent pas être utilisés ici, car express-handlebars ne prend pas en charge leur définition.

Le hack rapide et sale (qui est vraiment hacky et que je ne propose pas), consiste à utiliser

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
}));

Veuillez ajouter un Rocket-emoji à ce commentaire si vous souhaitez avoir un Handlebars.createWithAllowedProtoAccess ou quelque chose comme ça qui fait la partie centrale pour vous.

Tous les 13 commentaires

Cadres : express-handlebars en conjonction avec mongoose

Les modèles de Mongoose sont des classes et les propriétés ne sont pas des "propres propriétés" de l'objet parent.

La méthode la plus propre consiste à s'assurer que l'entrée du guidon est un objet javascript simple et approprié. Cela peut être fait dans Mongoose, en appelant toJSON() ou toObject

app.get('/test', function (_req, res) {
    Kitten.find({}).then(kittens => {
        res.render('test.hbs', {
            kittens: kittens.map(kitten => kitten.toJSON())
        })
    })
});

Les runtimeOptions (ou templateOptions ) mentionnés dans la documentation ne peuvent pas être utilisés ici, car express-handlebars ne prend pas en charge leur définition.

Le hack rapide et sale (qui est vraiment hacky et que je ne propose pas), consiste à utiliser

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
}));

Veuillez ajouter un Rocket-emoji à ce commentaire si vous souhaitez avoir un Handlebars.createWithAllowedProtoAccess ou quelque chose comme ça qui fait la partie centrale pour vous.

J'ai ce problème et je ne sais pas comment le résoudre, pouvez-vous m'aider ?

Quelqu'un peut-il me dire comment corriger cette erreur lorsque j'utilise un guidon ?
Erreur:
En-US: handlebars : accès refusé pour résoudre la propriété "name" car il ne s'agit pas d'une "propriété propre" de son parent.
Vous pouvez ajouter une option d'exécution pour désactiver la vérification ou cet avertissement :

Est-ce que quelqu'un sait comment signaler cette erreur lorsque vous utilisez le guidon ?
Erreur:
Fr : handlebars : accès refusé pour résoudre la propriété "name" car ce n'est pas la "propre propriété" de votre père.

Vous pouvez ajouter une option d'exécution pour désactiver la vérification ou cet avertissement :

Le mien est comme ça :
guidon const = require('express-handlebars')

app.engine('handlebars', handlebars({defaultLayout : 'main'}))
app.set('afficher le moteur', 'guidon')

app.get('/paiement', function(req, res){
Paiement.findAll().then(fonction(paiements){
res.render('paiement', {paiements : paiements})
})

Je voudrais utiliser l'amélioration. dans
Je voudrais utiliser l'amélioration. Br

Jetez un œil à ceci : https://www.npmjs.com/package/@handlebars/allow -prototype-access

Le runtimeOptions (ou templateOptions ) mentionné dans la documentation ne peut pas être utilisé ici, car express-handlebars ne prend pas en charge leur définition.

Étant donné que express-handlebars ne vous permet pas de définir ces options de configuration d'exécution, quelqu'un connaît-il une méthode pour forcer express-handlebars à utiliser handlebars 4.5.3 ?

Vous pouvez utiliser https://www.npmjs.com/package/@handlebars/allow -prototype-access avec express-handlebars . Il encapsule le modèle compilé afin que les paramètres par défaut soient définis.

Bonjour Nils, je n'arrive pas à faire fonctionner ce package, lorsque j'essaie de l'exécuter avec ce package, je reçois un message "Erreur : le module "handlebars" ne fournit pas de moteur d'affichage." Erreur. Il semble qu'un autre utilisateur rencontre un problème similaire dans https://github.com/wycats/handlebars.js/issues/1648 . J'ai posté mes résultats dans ce même fil. Merci

@craj1031tx j'ai répondu au #1648.

Cadres : express-handlebars en conjonction avec mongoose

Les modèles de Mongoose sont des classes et les propriétés ne sont pas des "propres propriétés" de l'objet parent.

La méthode la plus propre consiste à s'assurer que l'entrée du guidon est un objet javascript simple et approprié. Cela peut être fait dans Mongoose, en appelant toJSON() ou toObject

app.get('/test', function (_req, res) {
    Kitten.find({}).then(kittens => {
        res.render('test.hbs', {
            kittens: kittens.map(kitten => kitten.toJSON())
        })
    })
});

Les runtimeOptions (ou templateOptions ) mentionnés dans la documentation ne peuvent pas être utilisés ici, car express-handlebars ne prend pas en charge leur définition.

Le hack rapide et sale (qui est vraiment hacky et que je ne propose pas), consiste à utiliser

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
}));

Veuillez ajouter un Rocket-emoji à ce commentaire si vous souhaitez avoir un Handlebars.createWithAllowedProtoAccess ou quelque chose comme ça qui fait la partie centrale pour vous.

Merci mec :)

Je laisse la fusée là !

J'utilise Express-Handlebars avec Sequelize.
guidon npm ls:

+-- [email protected]
| `-- [email protected] 
`-- [email protected] 

Sortie 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

Je vais essayer avec votre solution pour la mangouste

Cadres : express-handlebars en conjonction avec mongoose

Les modèles de Mongoose sont des classes et les propriétés ne sont pas des "propres propriétés" de l'objet parent.

La méthode la plus propre consiste à s'assurer que l'entrée du guidon est un objet javascript simple et approprié. Cela peut être fait dans Mongoose, en appelant toJSON() ou toObject

app.get('/test', function (_req, res) {
    Kitten.find({}).then(kittens => {
        res.render('test.hbs', {
            kittens: kittens.map(kitten => kitten.toJSON())
        })
    })
});

Les runtimeOptions (ou templateOptions ) mentionnés dans la documentation ne peuvent pas être utilisés ici, car express-handlebars ne prend pas en charge leur définition.

Le hack rapide et sale (qui est vraiment hacky et que je ne propose pas), consiste à utiliser

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
}));

Veuillez ajouter un Rocket-emoji à ce commentaire si vous souhaitez avoir un Handlebars.createWithAllowedProtoAccess ou quelque chose comme ça qui fait la partie centrale pour vous.

Nous pouvons également utiliser la méthode lean () comme indiqué ci-dessous

 app.get('/test', function (_req, res) {
    Kitten.find().lean().then(kittens => res.render('test.hbs', { kittens: kittens}));
});

Étant donné que express-handlebars ne vous permet pas de définir ces options de configuration d'exécution, quelqu'un connaît-il une méthode pour forcer express-handlebars à utiliser handlebars 4.5.3 ?

J'ai créé un PR pour permettre l'ajout d'options de configuration d'exécution aux guidons express. https://github.com/express-handlebars/express-handlebars/pull/53

Cette page vous a été utile?
0 / 5 - 0 notes