"Wow điều này đã hoạt động, Tại sao điều này lại xảy ra? Tôi hiện đang sử dụng tay cầm tốc hành (3.1.0) mà tôi đặt làm công cụ kết xuất trong ứng dụng thể hiện của mình." - Lee Boon Kong ngày 12 tháng 1 lúc 14:13
"Trước đây, Tay cầm sẽ cho phép bạn truy cập các phương thức và thuộc tính nguyên mẫu của đối tượng đầu vào từ mẫu ... Nhiều vấn đề bảo mật đã xuất phát từ hành vi này ... Trong tay cầmbb @@ .4.6.0. Truy cập vào nguyên mẫu đối tượng Bây giờ, nếu bạn sử dụng các lớp tùy chỉnh làm đầu vào cho Tay cầm, mã của bạn sẽ không hoạt động nữa ... Gói này tự động thêm tùy chọn thời gian chạy cho mỗi cuộc gọi mẫu, vô hiệu hóa các hạn chế bảo mật ... Nếu người dùng của bạn đang viết các mẫu và bạn thực thi chúng trên máy chủ của mình, bạn KHÔNG nên sử dụng gói này mà nên tìm các cách khác để giải quyết vấn đề ...Tôi đề nghị bạn chuyển đổi các thể hiện lớp của mình thành các đối tượng JavaScript đơn giản trước khi chuyển chúng sang hàm mẫu. Mọi tài sản hoặc chức năng bạn truy cập, phải là "tài sản riêng" của cha mẹ. "- README
Thêm chi tiết tại đây:
https://www.npmjs.com/package/@handlebars/allow-prototype-access
PHƯƠNG PHÁP BẢO HIỂM NHANH VÀ TRỰC TIẾP
Cách sử dụng ( express-handlebars
và mongoose
):
express-handlebars
không cho phép bạn chỉ định các tùy chọn thời gian chạy để chuyển đến chức năng mẫu. Gói này có thể giúp bạn vô hiệu hóa kiểm tra nguyên mẫu cho các mô hình của bạn.
"Chỉ làm điều này, nếu bạn có toàn quyền kiểm soát các mẫu được thực thi trong máy chủ."
Các bước:
1 - Cài đặt phụ thuộc
npm i @handlebars/allow-prototype-access
2 - Sử dụng đoạn mã này làm ví dụ để viết lại máy chủ tốc hành của bạn
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 - Chạy máy chủ và thực hiện điệu nhảy hạnh phúc của bạn.
PHƯƠNG PHÁP AN TOÀN HƠN
Trước khi chuyển đối tượng được trả về bởi lệnh gọi AJAX của bạn đến mẫu Tay cầm, hãy ánh xạ nó vào một đối tượng mới với mỗi thuộc tính hoặc chức năng bạn cần truy cập trong .hbs
tệp của mình . Dưới đây bạn có thể thấy đối tượng mới được tạo trước khi chuyển nó vào mẫu Tay cầm.
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));
});
Truy vấn cầy mangut của bạn
Chỉnh sửa cho tôi nếu tôi sai nhưng tôi nghĩ rằng điều này có thể làm việc cho truy vấn của bạn ...
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;
});