"Uau, isso funcionou. Por que isso está acontecendo? No momento, estou usando o guidão expresso (3.1.0), que defini como mecanismo de renderização no meu aplicativo expresso." - Lee Boon Kong 12/01 às 14:13
"No passado, o Handlebars permitia acessar métodos e propriedades do protótipo do objeto de entrada do modelo ... Vários problemas de segurança surgiram desse comportamento ... No handlebars@^4.6.0. O acesso ao protótipo do objeto foi Agora, se você usar classes personalizadas como entrada no guidão, seu código não funcionará mais ... Este pacote adiciona automaticamente opções de tempo de execução a cada chamada de modelo, desativando as restrições de segurança ... Se seus usuários estiverem escrevendo modelos e você os executa no servidor, NÃO deve usar este pacote, mas sim encontrar outras maneiras de resolver o problema ...Sugiro que você converta suas instâncias de classe em objetos JavaScript simples antes de passá-los para a função de modelo. Toda propriedade ou função que você acessa deve ser uma "propriedade própria" de seu pai. "- README
Mais detalhes aqui:
https://www.npmjs.com/package/@handlebars/allow-prototype-access
MÉTODO INSEGURO RÁPIDO E SUJO
Uso ( express-handlebars
e mongoose
):
express-handlebars
não permite especificar opções de tempo de execução para passar para a função de modelo. Este pacote pode ajudá-lo a desativar as verificações de protótipo para seus modelos.
"Faça isso apenas se você tiver controle total sobre os modelos executados no servidor."
Passos:
1 - Instalar dependência
npm i @handlebars/allow-prototype-access
2 - Use este trecho como exemplo para reescrever seu servidor expresso
const express = require('express');
const mongoose = require('mongoose');
const Handlebars = require('handlebars');
const exphbs = require('express-handlebars');
// Import function exported by newly installed node modules.
const { allowInsecurePrototypeAccess } = require('@handlebars/allow-prototype->access');
const PORT = process.env.PORT || 3000;
const app = express();
const routes = require('./routes');
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(express.static('public'));
// When connecting Handlebars to the Express app...
app.engine('handlebars', exphbs({
defaultLayout: 'main',
// ...implement newly added insecure prototype access
handlebars: allowInsecurePrototypeAccess(Handlebars)
})
);
app.set('view engine', 'handlebars');
app.use(routes);
const MONGODB_URI = process.env.MONGODB_URI || >'mongodb://localhost/dbName';
mongoose.connect(MONGODB_URI);
app.listen(PORT, function () {
console.log('Listening on port: ' + PORT);
});
3 - Execute o servidor e faça sua dança feliz.
MÉTODO MAIS SEGURO E MAIS SEGURO
Antes de passar o objeto retornado pela sua chamada AJAX para o modelo do Handlebars, mapeie-o em um novo objeto com cada propriedade ou função que você precisa acessar em seu .hbs
arquivo. Abaixo, você pode ver o novo objeto criado antes de passá-lo para o modelo do guidão.
const router = require("express").Router();
const db = require("../../models");
router.get("/", function (req, res) {
db.Article.find({ saved: false })
.sort({ date: -1 })
.then(oldArticleObject => {
const newArticleObject = {
articles: oldArticleObject.map(data => {
return {
headline: data.headline,
summary: data.summary,
url: data.url,
date: data.date,
saved: data.saved
}
})
}
res.render("home", {
articles: newArticleObject.articles
})
})
.catch(error => res.status(500).send(error));
});
Sua consulta mangusto
Corrija-me se estiver errado, mas acho que isso pode funcionar para sua consulta ...
Confession.find()
.sort({ date: -1 })
.then(function (oldDoc) {
for (var i = 0; i < oldDoc.length; i++) {
//Check whether sender is anonymous
if (oldDoc[i].from === "" || oldDoc[i].from == null) {
oldDoc[i].from = "Anonymous";
}
//Add an extra JSON Field for formatted date
oldDoc[i].formattedDate = formatTime(oldDoc[i].date);
}
const newDoc = {
doc: oldDoc.map(function (data) {
return {
from: data.from,
formattedDate: data.formattedDate
}
})
}
res.render('index', { title: 'Confession Box', success: req.session.success, errors: req.session.errors, confession: newDoc.doc });
req.session.errors = null;
req.session.success = null;
});