Mongoose中req.params.id网页显示及库存更新问题排查
问题解决指南
1. 在GET路由页面显示req.params.id
你的GET路由/stockIn/:id已能获取req.params.id,只需在渲染页面时将该ID传递给模板引擎即可。
假设使用EJS/Pug这类模板引擎,修改getFlowerStockIn方法:
async function getFlowerStockIn(req, res) { const stockId = req.params.id; const stock = await Stocks.findOne({ _id: stockId }); // 若用自增ID则替换对应字段 res.render('stockIn', { stock: stock, currentId: stockId // 将ID传入模板 }); }
之后在模板中直接输出currentId即可(比如EJS中写<%= currentId %>)。
2. POST路由获取req.params.id的问题
当前POST路由/stock-in未定义:id参数,因此无法通过req.params.id获取ID,可通过两种方式解决:
- 修改POST路由为
/stock-in/:id,请求时URL携带ID,即可通过req.params.id获取; - 若不想修改路由,在表单中添加隐藏字段传递ID:
<input type="hidden" name="stockId" value="<%= currentId %>">
随后在postStockInAmount方法中通过req.body.stockId拿到ID。
3. 从新建文档改为更新现有库存
将新建Stocks文档的逻辑替换为Mongoose的更新方法,比如findByIdAndUpdate或findOneAndUpdate,假设库存字段为amount,要实现库存数量累加:
async function postStockInAmount(req, res) { const stockId = req.params.id || req.body.stockId; // 根据上述方式获取ID const addAmount = parseInt(req.body.amount); // 从表单获取待增加的数量 // 使用findByIdAndUpdate更新库存,$inc用于数值自增 await Stocks.findByIdAndUpdate( stockId, { $inc: { amount: addAmount } }, { new: true } // 可选:返回更新后的文档 ); res.redirect(`/stockIn/${stockId}`); // 更新后跳转回库存详情页 }
若使用自定义自增ID(而非Mongo默认_id),则改用findOneAndUpdate,调整查询条件:
await Stocks.findOneAndUpdate( { customId: stockId }, // 替换为你的自增ID字段名 { $inc: { amount: addAmount } }, { new: true } );
自增ID实现的注意事项
确保自增ID逻辑避免并发冲突,推荐用计数器集合维护:
// 计数器模型示例 const CounterSchema = new mongoose.Schema({ model: String, count: Number }); const Counter = mongoose.model('Counter', CounterSchema); // 获取下一个自增ID的方法 async function getNextSequence(modelName) { const counter = await Counter.findOneAndUpdate( { model: modelName }, { $inc: { count: 1 } }, { new: true, upsert: true } ); return counter.count; } // 新建库存时调用 const newStock = new Stocks({ customId: await getNextSequence('Stocks'), // 其他字段... }); await newStock.save();
内容的提问来源于stack exchange,提问作者Sarge Ole
相关产品推荐
相关产品推荐

