Handlebars.js: рд╣реИрдВрдбрд▓рдмрд╛рд░: рд╕рдВрдкрддреНрддрд┐ "..." рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА "рд╕реНрд╡рдпрдВ рдХреА рд╕рдВрдкрддреНрддрд┐" рдирд╣реАрдВ рд╣реИред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 18 рдЬрдире░ 2020  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: handlebars-lang/handlebars.js

рд╣реИрдВрдбрд▓рдмрд╛рд░ 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 рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдордзреНрдп рднрд╛рдЧ рдХрд░рддрд╛ рд╣реИред

рд╕рднреА 13 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЪреМрдЦрдЯреЗ: 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

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

morgondag picture morgondag  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

DylanPiercey picture DylanPiercey  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jasonh-brimar picture jasonh-brimar  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ustun picture ustun  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rizen picture rizen  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ