"Wow cela a fonctionné, pourquoi est-ce que cela se produit cependant? J'utilise actuellement un guidon express (3.1.0) que j'ai défini comme moteur de rendu dans mon application express." - Lee Boon Kong 12 janvier à 14h13
"Dans le passé, les guidons vous permettaient d'accéder aux méthodes et aux propriétés du prototype de l'objet d'entrée à partir du modèle ... Plusieurs problèmes de sécurité sont dus à ce comportement ... Dans le guidon@^4.6.0. L'accès au prototype d'objet a Désormais, si vous utilisez des classes personnalisées comme entrée pour les guidons, votre code ne fonctionnera plus ... Ce package ajoute automatiquement des options d'exécution à chaque modèle d'appels, désactivant les restrictions de sécurité ... Si vos utilisateurs écrivent modèles et que vous les exécutez sur votre serveur, vous ne devez PAS utiliser ce package, mais plutôt trouver d'autres moyens de résoudre le problème ...Je vous suggère de convertir vos instances de classe en objets JavaScript simples avant de les transmettre à la fonction de modèle. Chaque propriété ou fonction à laquelle vous accédez doit être une "propriété propre" de son parent. "- LISEZ-MOI
Plus de détails ici:
https://www.npmjs.com/package/@handlebars/allow-prototype-access
MÉTHODE D'INSECURE RAPIDE ET SALÉE
Utilisation ( express-handlebars
et mongoose
):
express-handlebars
ne vous permet pas de spécifier des options d'exécution à passer à la fonction de modèle. Ce package peut vous aider à désactiver les vérifications de prototype pour vos modèles.
"Ne faites cela que si vous avez un contrôle total sur les modèles exécutés sur le serveur."
Pas:
1 - Installer la dépendance
npm i @handlebars/allow-prototype-access
2 - Utilisez cet extrait de code comme exemple pour réécrire votre serveur 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 - Exécutez le serveur et faites votre danse heureuse.
MÉTHODE PLUS LONGUE ET SÉCURISÉE
Avant de passer l'objet renvoyé par votre appel AJAX au modèle Handlebars, mappez-le dans un nouvel objet avec chaque propriété ou fonction à laquelle vous devez accéder dans votre .hbs
fichier. Ci-dessous, vous pouvez voir le nouvel objet créé avant de le passer au modèle Handlebars.
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));
});
Votre requête mangouste
Corrigez-moi si je me trompe, mais je pense que cela pourrait fonctionner pour votre requête ...
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;
});