Sejak Handlebars 4.6.0, template tidak dapat mengakses properti dan metode prototipe lagi (secara default). Lihat #1633 untuk diskusi, alasan dan pembenaran.
Ada opsi runtime untuk memulihkan dan mengontrol perilaku lama (lihat https://handbarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access), tetapi jika Anda menggunakan kerangka kerja sebagai gantinya dari inti Handlebars, mungkin tidak jelas cara mengaturnya.
Jika Anda mendapatkan pesan kesalahan ini dan silakan tambahkan komentar dengan informasi berikut
express-hbs
, express-handlebars
) yang memanggil Handlebars saat kesalahan dicatat? (Tempel keluaran npm ls handlebars
atau yarn why handlebars
, jika tidak yakin).Handlebars.compile
dan fungsi templat yang dihasilkan secara langsung, Anda harus menjawab di sini https://handbarsjs.com/api-reference/runtime-options.html#options -to-control-prototype-access. Jika dokumentasi tidak menjawab pertanyaan Anda atau Anda tidak memahaminya, silakan bertanya (di sini) agar dokumentasi dapat ditingkatkan.express-handlebars
dalam hubungannya dengan mongoose
Model Mongoose adalah kelas dan propertinya bukan "properti sendiri" dari objek induk.
Metode terbersih adalah memastikan input setang adalah objek javascript biasa yang tepat. Ini dapat dilakukan di Mongoose, dengan menelepon toJSON()
atau toObject
app.get('/test', function (_req, res) {
Kitten.find({}).then(kittens => {
res.render('test.hbs', {
kittens: kittens.map(kitten => kitten.toJSON())
})
})
});
runtimeOptions
(atau templateOptions
) yang disebutkan dalam dokumentasi tidak dapat digunakan di sini, karena express-handlebars
tidak mendukung pengaturannya.
Peretasan cepat dan kotor (yang benar-benar peretasan dan saya tidak mengusulkannya), adalah menggunakan
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
}));
Silakan tambahkan Rocket-emoji ke komentar ini jika Anda ingin memiliki Handlebars.createWithAllowedProtoAccess
atau sesuatu seperti itu yang melakukan bagian tengah untuk Anda.
Saya memiliki masalah ini dan saya tidak tahu cara memperbaikinya, dapatkah Anda membantu saya?
Adakah yang bisa memberi tahu saya bagaimana saya memperbaiki kesalahan ini ketika saya menggunakan setang?
Kesalahan:
En-US: setang: akses ditolak untuk menyelesaikan properti "nama" karena bukan "milik sendiri" dari induknya.
Anda dapat menambahkan opsi runtime untuk menonaktifkan verifikasi atau peringatan ini:
Adakah yang tahu cara melaporkan kesalahan ini saat Anda menggunakan setang?
Kesalahan:
En: setang: akses ditolak untuk menyelesaikan properti "nama" karena itu bukan "milik sendiri" ayahmu.
Anda dapat menambahkan opsi runtime untuk menonaktifkan verifikasi atau peringatan ini:
Milik saya seperti ini:
const setang = membutuhkan('express-stang')
app.engine('stang', setang({defaultLayout: 'main'}))
app.set('melihat mesin', 'stang')
app.get('/payment', function(req, res){
Payment.findAll().then(fungsi(pembayaran){
res.render('pembayaran', {pembayaran: pembayaran})
})
Saya ingin menggunakan perangkat tambahan. di
Saya ingin menggunakan perangkat tambahan. br
Lihat ini: https://www.npmjs.com/package/@handbars/allow -prototype-access
runtimeOptions
(atautemplateOptions
) yang disebutkan dalam dokumentasi tidak dapat digunakan di sini, karenaexpress-handlebars
tidak mendukung pengaturannya.
Karena setang ekspres tidak mengizinkan Anda menyetel opsi konfigurasi waktu proses ini, adakah yang mengetahui metode untuk memaksa setang ekspres menggunakan setang 4.5.3?
Anda dapat menggunakan https://www.npmjs.com/package/@handbars/allow -prototype-access dengan express-handlebars
. Ini membungkus template yang dikompilasi sehingga parameter default ditetapkan.
Hai Nils, Saya tidak dapat menjalankan paket itu, ketika saya mencoba menjalankan dengan paket itu saya menerima "Kesalahan: Modul "stang" tidak menyediakan mesin tampilan." kesalahan. Tampaknya pengguna lain mengalami masalah serupa di https://github.com/wycats/handbars.js/issues/1648 . Saya memposting hasil saya di utas yang sama. Terima kasih
@craj1031tx saya menjawab di #1648.
Kerangka kerja:
express-handlebars
dalam hubungannya denganmongoose
Model Mongoose adalah kelas dan propertinya bukan "properti sendiri" dari objek induk.
Metode terbersih adalah memastikan input setang adalah objek javascript biasa yang tepat. Ini dapat dilakukan di Mongoose, dengan menelepon
toJSON()
atautoObject
app.get('/test', function (_req, res) { Kitten.find({}).then(kittens => { res.render('test.hbs', { kittens: kittens.map(kitten => kitten.toJSON()) }) }) });
runtimeOptions
(atautemplateOptions
) yang disebutkan dalam dokumentasi tidak dapat digunakan di sini, karenaexpress-handlebars
tidak mendukung pengaturannya.Peretasan cepat dan kotor (yang benar-benar peretasan dan saya tidak mengusulkannya), adalah menggunakan
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 }));
Silakan tambahkan Rocket-emoji ke komentar ini jika Anda ingin memiliki
Handlebars.createWithAllowedProtoAccess
atau sesuatu seperti itu yang melakukan bagian tengah untuk Anda.
Terima kasih Bung :)
Saya meninggalkan roket di sana!
Saya menggunakan Express-Handbars dengan Sequelize.
npm ls setang:
+-- [email protected]
| `-- [email protected]
`-- [email protected]
Keluaran Konsol:
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
Saya akan mencoba Anda dengan solusi Anda untuk luwak
Kerangka kerja:
express-handlebars
dalam hubungannya denganmongoose
Model Mongoose adalah kelas dan propertinya bukan "properti sendiri" dari objek induk.
Metode terbersih adalah memastikan input setang adalah objek javascript biasa yang tepat. Ini dapat dilakukan di Mongoose, dengan menelepon
toJSON()
atautoObject
app.get('/test', function (_req, res) { Kitten.find({}).then(kittens => { res.render('test.hbs', { kittens: kittens.map(kitten => kitten.toJSON()) }) }) });
runtimeOptions
(atautemplateOptions
) yang disebutkan dalam dokumentasi tidak dapat digunakan di sini, karenaexpress-handlebars
tidak mendukung pengaturannya.Peretasan cepat dan kotor (yang benar-benar peretasan dan saya tidak mengusulkannya), adalah menggunakan
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 }));
Silakan tambahkan Rocket-emoji ke komentar ini jika Anda ingin memiliki
Handlebars.createWithAllowedProtoAccess
atau sesuatu seperti itu yang melakukan bagian tengah untuk Anda.
Kita bisa kehilangan menggunakan metode lean() seperti yang ditunjukkan di bawah ini
app.get('/test', function (_req, res) { Kitten.find().lean().then(kittens => res.render('test.hbs', { kittens: kittens})); });
Karena setang ekspres tidak mengizinkan Anda menyetel opsi konfigurasi waktu proses ini, adakah yang mengetahui metode untuk memaksa setang ekspres menggunakan setang 4.5.3?
Saya membuat PR untuk memungkinkan penambahan opsi konfigurasi runtime ke setang ekspres. https://github.com/express-handbars/express-handbars/pull/53
Komentar yang paling membantu
Kerangka kerja:
express-handlebars
dalam hubungannya denganmongoose
Model Mongoose adalah kelas dan propertinya bukan "properti sendiri" dari objek induk.
Metode terbersih adalah memastikan input setang adalah objek javascript biasa yang tepat. Ini dapat dilakukan di Mongoose, dengan menelepon
toJSON()
atautoObject
runtimeOptions
(atautemplateOptions
) yang disebutkan dalam dokumentasi tidak dapat digunakan di sini, karenaexpress-handlebars
tidak mendukung pengaturannya.Peretasan cepat dan kotor (yang benar-benar peretasan dan saya tidak mengusulkannya), adalah menggunakan
Silakan tambahkan Rocket-emoji ke komentar ini jika Anda ingin memiliki
Handlebars.createWithAllowedProtoAccess
atau sesuatu seperti itu yang melakukan bagian tengah untuk Anda.