Начиная с 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
или что-то в этом роде выполняло для вас среднюю часть.
У меня есть эта проблема, и я не знаю, как ее решить, вы можете мне помочь?
Может ли кто-нибудь сказать мне, как я могу исправить эту ошибку, когда я использую руль?
Ошибка:
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
Самый полезный комментарий
Фреймворки:
express-handlebars
в сочетании сmongoose
Модели Mongoose являются классами, а свойства не являются «собственными свойствами» родительского объекта.
Самый чистый метод - убедиться, что руль-ввод является правильным простым объектом javascript. Это можно сделать в Mongoose, вызвав
toJSON()
илиtoObject
Упомянутые в документации
runtimeOptions
(илиtemplateOptions
) здесь использовать нельзя, посколькуexpress-handlebars
не поддерживает их настройку.Быстрый и грязный хак (который действительно хакерский, и я не предлагаю), заключается в использовании
Пожалуйста, добавьте к этому комментарию эмодзи-ракету, если вы хотите, чтобы
Handlebars.createWithAllowedProtoAccess
или что-то в этом роде выполняло для вас среднюю часть.