"বাহ এটি কাজ করেছে, যদিও এটি কেন হচ্ছে? আমি বর্তমানে এক্সপ্রেস-হ্যান্ডেলবারগুলি (৩.১.০) ব্যবহার করছি যা আমি আমার এক্সপ্রেস অ্যাপে রেন্ডার ইঞ্জিন হিসাবে সেট করেছি।" - লি বুন কং 12 জানুয়ারী 14:13 এ
"অতীতে, হ্যান্ডেলবারগুলি আপনাকে টেমপ্লেট থেকে প্রোটোটাইপ পদ্ধতি এবং ইনপুট অবজেক্টের বৈশিষ্ট্যগুলি অ্যাক্সেসের অনুমতি দেয় ... একাধিক সুরক্ষা সমস্যা এই আচরণ থেকে এসেছে ... হ্যান্ডেলবার্স ^^..6.০ তে অবজেক্টের প্রোটোটাইপটিতে অ্যাক্সেস রয়েছে সম্পূর্ণরূপে অক্ষম করা হয়েছে এখন, আপনি যদি হ্যান্ডলবারগুলিতে ইনপুট হিসাবে কাস্টম ক্লাস ব্যবহার করেন তবে আপনার কোডটি আর কাজ করবে না ... এই প্যাকেজটি স্বয়ংক্রিয়ভাবে প্রতিটি টেম্পলেট-কলগুলিতে সুরক্ষা বিধিনিষেধ অক্ষম করে রানটাইম বিকল্পগুলি যুক্ত করে ... যদি আপনার ব্যবহারকারীরা লিখছেন টেমপ্লেটগুলি এবং আপনি সেগুলি আপনার সার্ভারে চালিত করুন আপনার এই প্যাকেজটি ব্যবহার করা উচিত নয়, বরং সমস্যা সমাধানের জন্য অন্যান্য উপায়গুলি সন্ধান করা উচিত ...আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি আপনার শ্রেণি-দৃষ্টান্তগুলি টেম্পলেট ফাংশনে স্থান দেওয়ার আগে প্লে জাভাস্ক্রিপ্ট অবজেক্টে রূপান্তর করুন। প্রতিটি সম্পত্তি বা ফাংশন আপনি অ্যাক্সেস করেন, অবশ্যই এটি অবশ্যই তার পিতামাতার একটি "নিজস্ব সম্পত্তি" "" - পুনরায় পড়ুন
আরও বিশদ এখানে:
https://www.npmjs.com/package/@handlebars/allow-prototype-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;
});