Handlebars.js: Handlebars: Отказано в доступе для разрешения свойства "...", поскольку оно не является "собственным свойством" своего родителя.

Созданный на 18 янв. 2020  ·  13Комментарии  ·  Источник: handlebars-lang/handlebars.js

Начиная с Handlebars 4.6.0, шаблоны больше не могут обращаться к свойствам и методам прототипа (по умолчанию). См. № 1633 для обсуждения, причин и обоснований.

Существуют параметры времени выполнения для восстановления и управления старым поведением (см. https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access), но если вместо этого вы используете фреймворк ядра Handlebars, может быть непонятно, как их установить.

Если вы получили это сообщение об ошибке и добавьте комментарий со следующей информацией

  • Какая структура (например, express-hbs , express-handlebars ) вызывает Handlebars, когда регистрируется ошибка? (Вставьте вывод npm ls handlebars или yarn why handlebars , если не уверены).
  • Если вы используете Handlebars.compile и результирующую функцию шаблона напрямую, ваш ответ должен быть здесь https://handlebarsjs.com/api-reference/runtime-options.html#options -to-control-prototype-access. Если документация не отвечает на ваш вопрос или вы его не понимаете, спросите (здесь), чтобы документацию можно было улучшить.

Самый полезный комментарий

Фреймворки: express-handlebars в сочетании с mongoose

Модели Mongoose являются классами, а свойства не являются «собственными свойствами» родительского объекта.

Самый чистый метод - убедиться, что руль-ввод является правильным простым объектом javascript. Это можно сделать в Mongoose, вызвав toJSON() или toObject

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

Упомянутые в документации runtimeOptions (или templateOptions ) здесь использовать нельзя, поскольку express-handlebars не поддерживает их настройку.

Быстрый и грязный хак (который действительно хакерский, и я не предлагаю), заключается в использовании

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

Пожалуйста, добавьте к этому комментарию эмодзи-ракету, если вы хотите, чтобы Handlebars.createWithAllowedProtoAccess или что-то в этом роде выполняло для вас среднюю часть.

Все 13 Комментарий

Фреймворки: express-handlebars в сочетании с mongoose

Модели Mongoose являются классами, а свойства не являются «собственными свойствами» родительского объекта.

Самый чистый метод - убедиться, что руль-ввод является правильным простым объектом javascript. Это можно сделать в Mongoose, вызвав toJSON() или toObject

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

Упомянутые в документации runtimeOptions (или templateOptions ) здесь использовать нельзя, поскольку express-handlebars не поддерживает их настройку.

Быстрый и грязный хак (который действительно хакерский, и я не предлагаю), заключается в использовании

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

Пожалуйста, добавьте к этому комментарию эмодзи-ракету, если вы хотите, чтобы Handlebars.createWithAllowedProtoAccess или что-то в этом роде выполняло для вас среднюю часть.

У меня есть эта проблема, и я не знаю, как ее решить, вы можете мне помочь?

Может ли кто-нибудь сказать мне, как я могу исправить эту ошибку, когда я использую руль?
Ошибка:
En-US: handlebars: доступ запрещен для разрешения свойства «имя», поскольку оно не является «собственным свойством» своего родителя.
Вы можете добавить параметр времени выполнения, чтобы отключить проверку или это предупреждение:

Кто-нибудь знает, как сообщить об этой ошибке при использовании руля?
Ошибка:
Ru: handlebars: доступ запрещен для разрешения свойства «имя», потому что это не «собственная собственность» вашего отца.

Вы можете добавить параметр времени выполнения, чтобы отключить проверку или это предупреждение:

Мой такой:
const handlebars = require('экспресс-рули')

app.engine('рули', рули({defaultLayout: 'main'}))
app.set('движок просмотра', 'руль')

app.get('/платеж', function(req, res){
Payment.findAll().then(функция(платежи){
res.render('платеж', {платежи: платежи})
})

Я хотел бы использовать улучшение. в
Я хотел бы использовать улучшение. бр

Взгляните на это: https://www.npmjs.com/package/@handlebars/allow -prototype-access

Упомянутые в документации runtimeOptions (или templateOptions ) здесь использовать нельзя, поскольку express-handlebars не поддерживает их настройку.

Поскольку Express-Handlebars не позволяет вам устанавливать эти параметры конфигурации времени выполнения, кто-нибудь знает способ заставить Express-Handlebars использовать руль 4.5.3?

Вы можете использовать https://www.npmjs.com/package/@handlebars/allow -prototype-access с express-handlebars . Он упаковывает скомпилированный шаблон, чтобы были установлены параметры по умолчанию.

Привет, Нильс, я не могу заставить этот пакет работать, когда я пытаюсь запустить этот пакет, я получаю сообщение «Ошибка: модуль «handlebars» не предоставляет механизм просмотра». ошибка. Похоже, что другой пользователь сталкивается с аналогичной проблемой в https://github.com/wycats/handlebars.js/issues/1648 . Свои результаты я выложил в той же теме. Спасибо

@ craj1031tx Я ответил в № 1648.

Фреймворки: express-handlebars в сочетании с mongoose

Модели Mongoose являются классами, а свойства не являются «собственными свойствами» родительского объекта.

Самый чистый метод - убедиться, что руль-ввод является правильным простым объектом javascript. Это можно сделать в Mongoose, вызвав toJSON() или toObject

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

Упомянутые в документации runtimeOptions (или templateOptions ) здесь использовать нельзя, поскольку express-handlebars не поддерживает их настройку.

Быстрый и грязный хак (который действительно хакерский, и я не предлагаю), заключается в использовании

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

Пожалуйста, добавьте к этому комментарию эмодзи-ракету, если вы хотите, чтобы Handlebars.createWithAllowedProtoAccess или что-то в этом роде выполняло для вас среднюю часть.

Спасибо чувак :)

Я оставлю ракету там!

Я использую Express-Handlebars с Sequelize.
npm ls руль:

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

Выход консоли:

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

Я попробую ваше решение для мангуста

Фреймворки: express-handlebars в сочетании с mongoose

Модели Mongoose являются классами, а свойства не являются «собственными свойствами» родительского объекта.

Самый чистый метод - убедиться, что руль-ввод является правильным простым объектом javascript. Это можно сделать в Mongoose, вызвав toJSON() или toObject

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

Упомянутые в документации runtimeOptions (или templateOptions ) здесь использовать нельзя, поскольку express-handlebars не поддерживает их настройку.

Быстрый и грязный хак (который действительно хакерский, и я не предлагаю), заключается в использовании

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

Пожалуйста, добавьте к этому комментарию эмодзи-ракету, если вы хотите, чтобы Handlebars.createWithAllowedProtoAccess или что-то в этом роде выполняло для вас среднюю часть.

Мы также можем использовать метод lean(), как показано ниже.

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

Поскольку Express-Handlebars не позволяет вам устанавливать эти параметры конфигурации времени выполнения, кто-нибудь знает способ заставить Express-Handlebars использовать руль 4.5.3?

Я создал PR, чтобы разрешить добавлять параметры конфигурации во время выполнения в экспресс-рули. https://github.com/express-handlebars/express-handlebars/pull/53

Была ли эта страница полезной?
0 / 5 - 0 рейтинги