Node.js+MongoDB动态创建列表时默认数据未保存问题求助
问题排查与解决
嘿,我一眼就发现你代码里的问题啦!这是个新手很容易踩的小坑——字段名不匹配。
先看你的listSchema定义,存储列表项的字段明明是items:
const listSchema = new mongoose.Schema({ name: String, items: [listItemsSchema] });
但在创建newList实例的时候,你却用了list这个未在schema里定义的字段来传入默认项:
const newList = new List({ name: newListName, list: defaultItems });
Mongoose只会识别schema里声明过的字段,所以它直接忽略了list这个“无效”字段,自然不会把默认项保存到数据库里。
修正后的核心代码
把实例创建时的字段名改成items就能解决问题:
app.get("/:listName", (req, res) => { const newListName = req.params.listName; console.log(newListName); console.log(defaultItems); // 关键修正:把list改成items,和schema字段对应 const newList = new List({ name: newListName, items: defaultItems }); newList.save() .then(savedList => { console.log(savedList); // 现在items数组应该能正常显示了 // 记得给客户端返回响应,比如渲染页面或者重定向 res.redirect(`/${newListName}`); }) .catch(err => console.log(err)); });
额外优化建议
现在的代码每次访问/:listName都会创建一个新的List文档,哪怕同名列表已经存在了。这大概率不是你想要的效果,建议加个查询逻辑,先判断列表是否存在,不存在再创建:
app.get("/:listName", (req, res) => { const newListName = req.params.listName; List.findOne({ name: newListName }) .then(foundList => { if (!foundList) { // 列表不存在,创建新列表并保存 const newList = new List({ name: newListName, items: defaultItems }); return newList.save(); } // 列表已存在,直接返回 return foundList; }) .then(list => { console.log(list); // 这里可以渲染页面,比如用EJS的话: // res.render("list", { listTitle: list.name, newListItems: list.items }); res.send(list); }) .catch(err => console.log(err)); });
这样既避免了重复创建相同列表,又能确保默认项正确存入数据库啦!
内容的提问来源于stack exchange,提问作者Mark Funkhouser
相关产品推荐
相关产品推荐

