"Wow ha funzionato, perché sta succedendo questo? Attualmente sto usando express-handlebars (3.1.0) che ho impostato come motore di rendering nella mia app express." - Lee Boon Kong, 12 gennaio alle 14:13
"In passato, Handlebars ti consentiva di accedere ai metodi prototipo e alle proprietà dell'oggetto di input dal modello ... Molteplici problemi di sicurezza derivano da questo comportamento ... In handlebars@^4.6.0. L'accesso all'oggetto prototipo ha è stato completamente disabilitato. Ora, se usi le classi personalizzate come input per il manubrio, il tuo codice non funzionerà più ... Questo pacchetto aggiunge automaticamente opzioni di runtime a ciascuna chiamata del modello, disabilitando le restrizioni di sicurezza ... Se i tuoi utenti stanno scrivendo modelli e li esegui sul tuo server NON dovresti usare questo pacchetto, ma piuttosto trovare altri modi per risolvere il problema ...Ti suggerisco di convertire le tue istanze di classe in semplici oggetti JavaScript prima di passarle alla funzione template. Ogni proprietà o funzione a cui accedi deve essere una "proprietà propria" del suo genitore ". README
Maggiori dettagli qui:
https://www.npmjs.com/package/@handlebars/allow-prototype-access
METODO DI INSECURA VELOCE E SPORCO
Utilizzo ( express-handlebars
e mongoose
):
express-handlebars
non consente di specificare le opzioni di runtime da passare alla funzione template. Questo pacchetto può aiutarti a disabilitare i controlli prototipo per i tuoi modelli.
"Fallo solo se hai il pieno controllo dei modelli eseguiti nel server."
passi:
1 - Installa dipendenza
npm i @handlebars/allow-prototype-access
2 - Usa questo frammento come esempio per riscrivere il tuo server rapido
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 - Esegui il server e fai la tua danza felice.
METODO PIÙ SICURO PIÙ LUNGO
Prima di passare l'oggetto restituito dalla chiamata AJAX al modello Handlebars, mapparlo in un nuovo oggetto con ogni proprietà o funzione a cui è necessario accedere nel .hbs
file. Di seguito puoi vedere il nuovo oggetto creato prima di passarlo al modello Manubrio.
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));
});
La tua richiesta di mangusta
Correggimi se sbaglio, ma penso che potrebbe funzionare per la tua query ...
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;
});