"Wow, esto funcionó, ¿por qué está sucediendo esto? Actualmente estoy usando express-handlebars (3.1.0) que configuré como motor de renderizado en mi aplicación express". - Lee Boon Kong 12 de enero a las 14:13
"En el pasado, Handlebars le permitía acceder a métodos prototipo y propiedades del objeto de entrada desde la plantilla ... Múltiples problemas de seguridad han surgido de este comportamiento ... En handlebars@^4.6.0. El acceso al prototipo de objeto tiene se ha deshabilitado por completo. Ahora, si usa clases personalizadas como entrada para Manillares, su código ya no funcionará ... Este paquete agrega automáticamente opciones de tiempo de ejecución a cada plantilla de llamadas, deshabilitando las restricciones de seguridad ... Si sus usuarios están escribiendo plantillas y las ejecutas en tu servidor NO debes usar este paquete, sino encontrar otras formas de resolver el problema ...Le sugiero que convierta sus instancias de clase en objetos JavaScript simples antes de pasarlos a la función de plantilla. Cada propiedad o función a la que acceda debe ser una "propiedad propia" de su padre ". - README
Más detalles aquí:
https://www.npmjs.com/package/@handlebars/allow-prototype-access
MÉTODO DE SEGURIDAD RÁPIDA Y SUCIA
Uso ( express-handlebars
y mongoose
):
express-handlebars
no le permite especificar opciones de tiempo de ejecución para pasar a la función de plantilla. Este paquete puede ayudarlo a deshabilitar las comprobaciones de prototipo para sus modelos.
"Solo haga esto si tiene control total sobre las plantillas que se ejecutan en el servidor".
Pasos:
1 - Instalar dependencia
npm i @handlebars/allow-prototype-access
2 - Use este fragmento como ejemplo para reescribir su servidor express
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 - Ejecuta el servidor y baila alegremente.
MÉTODO MÁS SEGURO Y SEGURO
Antes de pasar el objeto devuelto por su llamada AJAX a la plantilla Handlebars, asigne un objeto nuevo con cada propiedad o función a la que necesite acceder en su .hbs
archivo. A continuación puede ver el nuevo objeto hecho antes de pasarlo a la plantilla de Manillares.
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));
});
Su consulta de mangosta
Corrígeme si me equivoco, pero creo que esto podría funcionar para tu 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;
});