рд╣реИрдВрдбрд▓рдмрд╛рд░ 4.6.0 рдХреЗ рдмрд╛рдж рд╕реЗ, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЕрдм рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЧреБрдгреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ)ред рдЪрд░реНрдЪрд╛рдУрдВ, рдХрд╛рд░рдгреЛрдВ рдФрд░ рдФрдЪрд┐рддреНрдп рдХреЗ рд▓рд┐рдП #1633 рджреЗрдЦреЗрдВред
рдкреБрд░рд╛рдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ (рджреЗрдЦреЗрдВ https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access), рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╣реИрдВрдбрд▓рдмрд╛рд░реНрд╕ рдХреЛрд░ рдХреЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдХреГрдкрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ
express-hbs
, express-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
рдиреЗрд╡рд▓рд╛ рдХреЗ рдореЙрдбрд▓ рд╡рд░реНрдЧ рд╣реИрдВ рдФрд░ рдЧреБрдг рдореВрд▓ рд╡рд╕реНрддреБ рдХреЗ "рд╕реНрд╡рдпрдВ рдХреЗ рдЧреБрдг" рдирд╣реАрдВ рд╣реИрдВред
рд╕рдмрд╕реЗ рд╕рд╛рдл рддрд░реАрдХрд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╣реИрдВрдбрд▓рдмрд╛рд░-рдЗрдирдкреБрдЯ рдПрдХ рдЙрдЪрд┐рдд рд╕рд╛рджрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рдпрд╣ 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: рд╣реИрдВрдбрд▓рдмрд╛рд░реНрд╕: "рдирд╛рдо" рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдирд┐рд╖реЗрдз рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдкрд┐рддрд╛ рдХреА "рдЕрдкрдиреА рд╕рдВрдкрддреНрддрд┐" рдирд╣реАрдВ рд╣реИред
рд╕рддреНрдпрд╛рдкрди рдпрд╛ рдЗрд╕ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд░рдирдЯрд╛рдЗрдо рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
рдореЗрд░рд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
рдХреЙрдиреНрд╕ рд╣реИрдВрдбрд▓рдмрд╛рд░реНрд╕ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╣реИрдВрдбрд▓рдмрд╛рд░')
рдРрдк.рдЗрдВрдЬрди ('рд╣реИрдВрдбрд▓рдмрд╛рд░', рд╣реИрдВрдбрд▓рдмрд╛рд░реНрд╕ ({рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓реЗрдЖрдЙрдЯ: 'рдореБрдЦреНрдп'}))
app.set ('рдЗрдВрдЬрди рджреЗрдЦреЗрдВ', 'рд╣реИрдВрдбрд▓рдмрд╛рд░реНрд╕')
app.get('/ payment', function(req, res){
Payment.findAll ()ред рддрдм (рдлрд╝рдВрдХреНрд╢рди (рднреБрдЧрддрд╛рди) {
res.render('рднреБрдЧрддрд╛рди', {рднреБрдЧрддрд╛рди: рднреБрдЧрддрд╛рди})
})
рдореИрдВ рд╕рдВрд╡рд░реНрджреНрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореЗрдВ
рдореИрдВ рд╕рдВрд╡рд░реНрджреНрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдмреАрдЖрд░
рдЗрд╕реЗ рджреЗрдЦреЗрдВ: https://www.npmjs.com/package/@handlebars/allow -prototype-access
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд
runtimeOptions
(рдпрд╛templateOptions
) рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐express-handlebars
рдЙрдиреНрд╣реЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЪреВрдВрдХрд┐ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╣реИрдВрдбрд▓рдмрд╛рд░ рдЖрдкрдХреЛ рдЗрди рд░рдирдЯрд╛рдЗрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╣реИрдВрдбрд▓рдмрд╛рд░ рдХреЛ рд╣реИрдВрдбрд▓рдмрд╛рд░ 4.5.3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ?
рдЖрдк express-handlebars
рдХреЗ рд╕рд╛рде https://www.npmjs.com/package/@handlebars/allow -prototype-access рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рд╣реЛ рдЬрд╛рдПрдВред
рд╣рд╛рдп рдирд┐рд▓реНрд╕, рдореИрдВ рдЙрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВ, рдЬрдм рдореИрдВ рдЙрд╕ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ "рддреНрд░реБрдЯрд┐: рдореЙрдбреНрдпреВрд▓" рд╣реИрдВрдбрд▓рдмрд╛рд░ "рдПрдХ рджреГрд╢реНрдп рдЗрдВрдЬрди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред" рддреНрд░реБрдЯрд┐ред рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ https://github.com/wycats/handlebars.js/issues/1648 рдореЗрдВ рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдо рдЙрд╕реА рдзрд╛рдЧреЗ рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдПред рдзрдиреНрдпрд╡рд╛рдж
@ craj1031tx рдореИрдВрдиреЗ #1648 рдореЗрдВ рдЙрддреНрддрд░ рджрд┐рдпрд╛ред
рдЪреМрдЦрдЯреЗ:
express-handlebars
рдХреЗ рд╕рд╛рде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
рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдордзреНрдп рднрд╛рдЧ рдХрд░рддрд╛ рд╣реИред
рдзрдиреНрдпрд╡рд╛рдж рджреЛрд╕реНрдд :)
рдореИрдВ рд░реЙрдХреЗрдЯ рд╡рд╣реАрдВ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВ!
рдореИрдВ Sequelize рдХреЗ рд╕рд╛рде рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╣реИрдВрдбрд▓рдмрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред
рдПрдирдкреАрдПрдо рдПрд▓рдПрд╕ рд╣реИрдВрдбрд▓рдмрд╛рд░реНрд╕:
+-- [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
рдиреЗрд╡рд▓рд╛ рдХреЗ рдореЙрдбрд▓ рд╡рд░реНрдЧ рд╣реИрдВ рдФрд░ рдЧреБрдг рдореВрд▓ рд╡рд╕реНрддреБ рдХреЗ "рд╕реНрд╡рдпрдВ рдХреЗ рдЧреБрдг" рдирд╣реАрдВ рд╣реИрдВред
рд╕рдмрд╕реЗ рд╕рд╛рдл рддрд░реАрдХрд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╣реИрдВрдбрд▓рдмрд╛рд░-рдЗрдирдкреБрдЯ рдПрдХ рдЙрдЪрд┐рдд рд╕рд╛рджрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рдпрд╣
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
рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдордзреНрдп рднрд╛рдЧ рдХрд░рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рд▓реАрди () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
app.get('/test', function (_req, res) { Kitten.find().lean().then(kittens => res.render('test.hbs', { kittens: kittens})); });
рдЪреВрдВрдХрд┐ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╣реИрдВрдбрд▓рдмрд╛рд░ рдЖрдкрдХреЛ рдЗрди рд░рдирдЯрд╛рдЗрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╣реИрдВрдбрд▓рдмрд╛рд░ рдХреЛ рд╣реИрдВрдбрд▓рдмрд╛рд░ 4.5.3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ?
рдореИрдВрдиреЗ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╣реИрдВрдбрд▓рдмрд╛рд░ рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдмрдирд╛рдпрд╛ред https://github.com/express-handlebars/express-handlebars/pull/53
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЪреМрдЦрдЯреЗ:
express-handlebars
рдХреЗ рд╕рд╛рдеmongoose
рдиреЗрд╡рд▓рд╛ рдХреЗ рдореЙрдбрд▓ рд╡рд░реНрдЧ рд╣реИрдВ рдФрд░ рдЧреБрдг рдореВрд▓ рд╡рд╕реНрддреБ рдХреЗ "рд╕реНрд╡рдпрдВ рдХреЗ рдЧреБрдг" рдирд╣реАрдВ рд╣реИрдВред
рд╕рдмрд╕реЗ рд╕рд╛рдл рддрд░реАрдХрд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╣реИрдВрдбрд▓рдмрд╛рд░-рдЗрдирдкреБрдЯ рдПрдХ рдЙрдЪрд┐рдд рд╕рд╛рджрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рдпрд╣
toJSON()
рдпрд╛toObject
. рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рдиреЗрд╡рд▓рд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИрджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд
runtimeOptions
(рдпрд╛templateOptions
) рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐express-handlebars
рдЙрдиреНрд╣реЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИредрддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджреА рд╣реИрдХ (рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИрдХреА рд╣реИ рдФрд░ рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реИ), рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ
рдХреГрдкрдпрд╛ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдПрдХ рд░реЙрдХреЗрдЯ-рдЗрдореЛрдЬреА рдЬреЛрдбрд╝реЗрдВ рдпрджрд┐ рдЖрдк
Handlebars.createWithAllowedProtoAccess
рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдордзреНрдп рднрд╛рдЧ рдХрд░рддрд╛ рд╣реИред