同一页面增改时EJS输入框无法渲染数据的问题排查
我帮你排查出两个关键问题,这就是你的三元运算符没生效的原因:
1. EJS模板语法错误
你在输入框的value属性里嵌套了EJS标签,这是不符合EJS语法规则的。EJS的<%= %>标签本身就是用来输出表达式结果的,不需要再在里面套一层<% %>。
错误写法:
<input type="text" class="form-control" name="landingTitle" value="<% result ? <%= result.landingTitle %> : '' %>" />
修正后的写法:
<input type="text" class="form-control" name="landingTitle" value="<%= result ? result.landingTitle : '' %>" />
这样就能正确判断result是否存在,存在就输出landingTitle,否则输出空字符串。
2. 后端查询的参数错误+ObjectId类型问题
你的后端代码里,查询条件用了topic_id,但这个变量根本没定义!应该用req.params.id来获取URL中:id部分的参数。另外,MongoDB中默认的_id是ObjectId类型,直接传字符串类型的req.params.id是匹配不到数据的,必须转换成ObjectId。
修正后的后端代码:
// 点击数据进行更新时 router.get("/display/:id", (req, res) => { // 引入ObjectId类型 const { ObjectId } = require('mongodb'); MongoClient.connect( process.env.ATLAS_URI, { useNewUrlParser: true }, (err, db) => { if (err) { console.error('数据库连接错误:', err); return res.status(500).send('数据库连接失败'); } const dbo = db.db("xxx"); dbo .collection("xxx") // 把字符串id转换成ObjectId,同时用req.params.id获取URL参数 .findOne({ _id: new ObjectId(req.params.id) }, (err, result) => { if (err) { console.error('数据查询错误:', err); return res.status(500).send('查询数据失败'); } res.render("pages/dashboard", { result }); db.close(); }); } ); });
额外建议
如果你的Node.js版本支持async/await,建议把回调写法改成async/await,这样代码更易读,错误处理也更简洁:
const { MongoClient, ObjectId } = require('mongodb'); router.get("/display/:id", async (req, res) => { let db; try { db = await MongoClient.connect(process.env.ATLAS_URI, { useNewUrlParser: true }); const dbo = db.db("xxx"); const result = await dbo.collection("xxx").findOne({ _id: new ObjectId(req.params.id) }); res.render("pages/dashboard", { result }); } catch (err) { console.error('错误:', err); res.status(500).send('操作失败'); } finally { if (db) db.close(); } });
这样修改后,当你点击展示页面的某条数据时,对应的内容应该就能正确显示在输入框里了。
内容的提问来源于stack exchange,提问作者sherin shaju
相关产品推荐
相关产品推荐

