解析属性“名称”的访问被拒绝,因为它不是其父级的“自己的属性”

Hap*_*tel 3 mongoose mongodb node.js express express-handlebars

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

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);
        }
    }); 
})
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚出了什么问题。我已将用户输入的值传递为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>
Run Code Online (Sandbox Code Playgroud)

Hap*_*tel 5

如果您使用 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
Run Code Online (Sandbox Code Playgroud)

})

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

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

脚步:

1 - 安装依赖项

npm i @handlebars/allow-prototype-access
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

3 - 运行服务器并跳起你快乐的舞蹈。