解决了! 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);
}
});
})
我正在尝试获取用户在表单字段中输入的详细信息,以便我可以编辑和更新所选记录。但是,当我单击编辑按钮时,我在表单中看到了空白表单字段。
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);
}
});
})