簡體   English   中英

Express Handlebars 不會渲染數據

[英]Express Handlebars Won't Render Data

我正在使用 Express-Handlebars 模板引擎使用 NodeJS 和 Express。

Handlebars 在嘗試渲染模板時拋出以下錯誤:

Handlebars:訪問已被拒絕解析屬性“用戶名”,因為它不是其父級的“自己的屬性”。 您可以添加運行時選項以禁用檢查或此警告:有關詳細信息,請參閱https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access

根據上面的鏈接:

從 4.6.0 版本開始,Handlebars 默認禁止訪問上下文對象的原型屬性和方法。 原因是這種可能性引起的各種安全問題。

我的 app.js 包含以下內容:

const exphbs = require('express-handlebars');
const express = require('express');
// Init Express
const app = express();
// VIEW ENGINE
app.engine('handlebars', exphbs({
  defaultLayout: 'main'
}));
app.set('view engine', 'handlebars');

我的路由文件通過 Mongoose 從 MongoDB 獲取:

 //@GET - View router.get('/', authMiddleware, (req, res, next) => { // Mongoose Model.find({ user: req.user._id }) .sort({ date: -1 }) .then(model => { res.render('/overview', { model: model }) }) .catch(err => { if (err) throw err; req.flash('error_msg', 'No Model Found'); }) })

模型是一個對象數組

這個問題只是在我開始添加把手助手之后才開始發生。 我已經刪除了幫助程序並恢復到我的原始配置設置(上面)無濟於事。 我試過刪除 node_modules 文件夾並重新安裝 npm。

發送的是一個對象數組,我正在嘗試使用 {{#each model}} 幫助程序遍歷對象的屬性,並通過每個對象中的 {{prop1}} 引用各個屬性。

根據 Handlebars 的說法,默認情況下禁用 proto 屬性是 false,並且此更改不應破壞任何內容。

我的問題:

  1. 我是否錯誤地向車把發送數據? 如果是這樣,將數據發送到 express-handlebars 模板進行渲染的正確方法是什么(不將我的服務器暴露給安全漏洞)?

先感謝您。

當我升級把手包時,我遇到了同樣的問題。 為了讓您的系統盡快重新上線,請刪除 package.json 中的 handlebars 條目,然后在其位置插入這一行。

"handlebars": "4.5.3",

從 4.6.0 版本開始,Handlebars 默認禁止訪問上下文對象的原型屬性和方法。 這與此處描述的安全問題有關: https : //mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html

參考https://github.com/wycats/handlebars.js/issues/1642

上述 URL 中的一個示例顯示了轉換為 JSON 的 Mongoose 響應:

app.get('/test', function (_req, res) {
    Kitten.find({}).then(kittens => {
        res.render('test.hbs', {
            kittens: kittens.map(kitten => kitten.toJSON())
        })
    })
});

如果您確定只有受信任的開發人員且沒有最終用戶可以訪問車把模板,則可以通過安裝以下軟件包來允許原型訪問:

npm install @handlebars/allow-prototype-access

這是它的使用示例:

const express = require('express');
const Handlebars = require('handlebars')
const expressHandlebars = require('express-handlebars');
const {allowInsecurePrototypeAccess} = require('@handlebars/allow-prototype-access')

const app = express();

app.engine('handlebars', expressHandlebars({
    handlebars: allowInsecurePrototypeAccess(Handlebars)
}));
app.set('view engine', 'handlebars');
...

另一種選擇是使用 mongoose .lean() 函數。 這樣做的好處是比傳統的貓鼬查詢快得多。 但它也有一些缺點。 默認情況下,Mongoose 查詢返回 Mongoose Document 類的實例。 這些對象包含許多用於更改跟蹤的內部狀態,並具有其他方法,例如 .save()。 啟用精簡選項會告訴 Mongoose 跳過實例化完整的 Mongoose 文檔而只返回普通的 javascript 對象。

正確的! 我曾經使用SequelizetoJSON()來解決問題。

如果您已經嘗試過但沒有奏效,我認為在 Mongoose 中使用精益可以實現相同的結果 2 小時前

我加.lean之間.sort().then()這個工作!

.lean()之后使用.find()它可以正常工作

@OctavianLabs對於這種錯誤。您應該嘗試以下代碼。

 Model.find({ user: req.user._id })
    .sort({ date: -1 })
    .lean()
    .then(model => {
      res.render('/overview', { model: model })
    })

正如@OctavianLabs 所回答的,它對我有幫助:

const posts = await this.find({})
 .limit(amount)
 .lean();

mongoose 的lean方法返回純 JavaScript 對象 (POJO),而不是 Mongoose 文檔。

在 .find() 之后使用 .lean() 此函數使數據獲取速度更快

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM