解决了! Handlebars:已拒绝访问以解析 属性 "name",因为它不是其父项的 "own property" 已修复

Solved! Handlebars: Access has been denied to resolve the property "name" because it is not an "own property" of its parent Fixed

我正在尝试获取用户在表单字段中输入的详细信息,以便我可以编辑和更新所选记录。但是,当我单击编辑按钮时,我在表单中看到了空白表单字段。

router.get('/list', (req, res) => {
    Employee.find((err, docs) => {
        if (!err) {
            res.render("employee/list", {
                list: docs,
            });
        }
        else {
            console.log('Error in retrieving employee list :' + err);
        }
    }); 
})

我不知道哪里出了问题。我已将用户输入的值传递为 req.body。所有操作都正常工作,但无法更新记录,因为我无法从表单中获取用户 ID。

<tbody>
    {{#each list}}
    <tr>
        <td>{{this.name}}</td>
        <td>{{this.email}}</td>
        <td>{{this.mobile}}</td>
        <td>{{this.city}}</td>
        <td>
            <a href="/employee/{{this._id}}"><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a>
            <a href="/employee/delete/{{this._id}}" onclick="return confirm('Are you sure to delete this record ?');"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a>
        </td>
    </tr>
    {{/each}}
</tbody>

如果您使用的是 mongoose 和较新版本的 express-handlebars,可以通过在 find() 之后使用 lean() 方法来解决,例如:

router.get('/list', (req, res) => {
Employee.find((err, docs) => {
    if (!err) {
        res.render("employee/list", {
            list: docs,
        });
    }
    else {
        console.log('Error in retrieving employee list :' + err);
    }
})**.lean()**; // It is prevent the warning when trying to display records

})

---------------- 您可以遵循的另一个选项-------------------- ----------

express-handlebars 不允许您指定传递给模板函数的运行时选项。此软件包可以帮助您禁用模型的原型检查。

步骤:

1 - 安装依赖项

npm i @handlebars/allow-prototype-access

2 - 使用此代码段作为示例来重写您的快速服务器

const express = require('express')
const path = require('path')
**const Handlebars = require('handlebars')**
**const hbs = require('express-handlebars');**
const bodyParser = require('body-parser');

**const { allowInsecurePrototypeAccess } = require('@handlebars/allow-prototype-access');**
const employeeController = require('./controller/employeeController')

const app = express()
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())

app.set('views', path.join(__dirname, '/views/'))
app.engine('hbs', hbs({ extname: 'hbs', defaultLayout: 'mainLayout', layoutsDir: __dirname + '/views/layouts/', **handlebars: allowInsecurePrototypeAccess(Handlebars)** }))
app.set('view engine', 'hbs')

app.listen(3000, () => {
    console.log('Server started at port 3000')
})

app.use(employeeController)

3 - 运行服务器,尽情跳吧。

如果您使用 MySQL,sequelize,使用原始查询选项 {raw: true} 如果您使用关系,则可以使用 {nest: true},例如:

users = await User.findAll({
    where: { username: "SimonAngatia" },
    include: [{ model: Tweet, as: "Tweets" }],
    raw: true,
    nest: true,
  }).catch(errorHandler);

参考这里:Sequelize, convert entity to plain object

您可以在数据传输前自定义文档。

router.get('/list', (req, res) => {
    Employee.find((err, docs) => {
        if (!err) {
            docs= docs.map(item=> item.toObject())
            res.render("employee/list", {
                list: docs,
            });
        }
        else {
            console.log('Error in retrieving employee list :' + err);
        }
    }); 
})