"वाह यह काम किया, हालांकि यह क्यों हो रहा है? मैं वर्तमान में एक्सप्रेस-हैंडलबार (3.1.0) का उपयोग कर रहा हूं जिसे मैंने अपने एक्सप्रेस ऐप में एक रेंडर इंजन के रूप में सेट किया है।" - ली बून कोंग 12 जनवरी को 14:13 बजे
"अतीत में, हैंडलबार आपको टेम्प्लेट से इनपुट ऑब्जेक्ट के प्रोटोटाइप तरीकों और गुणों तक पहुंचने की अनुमति देगा ... इस सुरक्षा से कई सुरक्षा मुद्दे आए हैं ... हैंडलबार्स @^4.6.0 में ऑब्जेक्ट प्रोटोटाइप तक पहुंच है। पूरी तरह से अक्षम कर दिया गया है। अब, यदि आप हैंडलबार्स के इनपुट के रूप में कस्टम कक्षाओं का उपयोग करते हैं, तो आपका कोड अब काम नहीं करेगा ... यह पैकेज स्वचालित रूप से प्रत्येक टेम्पलेट-कॉल में रनटाइम विकल्प जोड़ता है, सुरक्षा प्रतिबंधों को अक्षम करता है ... यदि आपके उपयोगकर्ता लिख रहे हैं। टेम्पलेट्स और आप उन्हें अपने सर्वर पर निष्पादित करते हैं, आपको इस पैकेज का उपयोग नहीं करना चाहिए, बल्कि समस्या को हल करने के अन्य तरीके खोजने चाहिए ...मेरा सुझाव है कि आप अपने वर्ग-उदाहरणों को टेम्प्लेट फ़ंक्शन में पास करने से पहले सादे जावास्क्रिप्ट ऑब्जेक्ट में परिवर्तित करें। आपके द्वारा उपयोग की जाने वाली प्रत्येक संपत्ति या फ़ंक्शन, उसके माता-पिता की "स्वयं की संपत्ति" होनी चाहिए। "- README
अधिक विवरण यहां:
https://www.npmjs.com/package/@handlebars/allow-prototyp-access
क्विक एंड ड्यूरी इंस्क्योर मैथोड
उपयोग ( express-handlebars
और mongoose
):
express-handlebars
आपको टेम्पलेट फ़ंक्शन को पास करने के लिए रनटाइम-विकल्प निर्दिष्ट करने की अनुमति नहीं देता है। यह पैकेज आपके मॉडलों के लिए प्रोटोटाइप चेक को अक्षम करने में आपकी मदद कर सकता है।
"केवल यह करें, यदि आपके पास सर्वर में निष्पादित होने वाले टेम्पलेट्स पर पूर्ण नियंत्रण है।"
कदम:
1 - निर्भरता स्थापित करें
npm i @handlebars/allow-prototype-access
2 - इस स्निपेट को अपने एक्सप्रेस सर्वर को फिर से लिखने के लिए एक उदाहरण के रूप में उपयोग करें
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 - सर्वर चलाएं और अपने खुश नृत्य करें।
लंबे समय से अधिक सुरक्षित विधि
अपने AJAX कॉल द्वारा लौटे ऑब्जेक्ट को हैंडलबार्स टेम्प्लेट में पास करने से पहले, उसे अपनी .hbs
फ़ाइल में पहुंचने वाली प्रत्येक संपत्ति या फ़ंक्शन के साथ एक नई ऑब्जेक्ट में मैप करें । नीचे आप हैंडलबार्स टेम्प्लेट को पास करने से पहले बनाई गई नई वस्तु को देख सकते हैं।
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));
});
आपकी मोंगोज़ क्वेरी
अगर मैं गलत हूं तो मुझे सुधार लो लेकिन मुझे लगता है कि यह आपकी क्वेरी के लिए काम कर सकता है ...
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;
});