如何使用Express和Sequelize实现更新路由并解决Handlebars传参问题?
Node + Express + Sequelize 更新路由与Handlebars表单问题解决
一、路由代码修复
你的路由存在三个核心问题:混用MongoDB语法、未处理异步逻辑、缺少响应返回,修复后代码如下:
app.put('/updateitem/:id', async(req, res) => { try { const itemId = req.params.id; // 转换参数类型并计算利润字段 const preco = parseFloat(req.body.Preco); const pcompra = parseFloat(req.body.Pcompra); const lucroliq = preco - pcompra; const lucro = parseFloat(((preco - pcompra) / pcompra) * 100).toFixed(2); // Sequelize官方更新语法,返回受影响行数 const [updatedCount] = await Item.update( { Codigo: req.body.Codigo, Descricao: req.body.Descricao, Quantidade: parseInt(req.body.Quantidade), Preco: preco, Pcompra: pcompra, Lucroliq: lucroliq, Lucro: lucro }, { where: { id: itemId } } ); // 处理未找到对应条目的情况 if (updatedCount === 0) { return res.status(404).send('Item não encontrado'); } // 更新完成后重定向或返回JSON,根据业务需求调整 res.redirect('/'); } catch (error) { console.error('Erro ao atualizar:', error); res.status(500).send('Erro interno do servidor'); } });
二、Handlebars表单修复
HTML原生表单不支持PUT方法,且URL参数格式错误,按以下步骤修复:
1. 安装并配置method-override中间件
用于将POST请求伪装成PUT:
npm install method-override
在Express入口文件中添加配置:
const methodOverride = require('method-override'); // 解析表单数据 app.use(express.urlencoded({ extended: true })); // 启用方法覆盖 app.use(methodOverride('_method'));
2. 修改表单代码
<form action="/updateitem/{{item.id}}" method="POST"> <!-- 隐藏字段指定实际请求方法为PUT --> <input type="hidden" name="_method" value="PUT"> <p>Código</p> <input type="text" value="{{item.Codigo}}" name="Codigo" placeholder="Codigo do Produto"> <br><br><br> <p>Descrição</p> <input type="text" value="{{item.Descricao}}" name="Descricao" placeholder="Descricao do Produto"> <br><br><br> <p>Quantidade</p> <input type="number" value="{{item.Quantidade}}" name="Quantidade" placeholder="Quantidade de itens"> <br><br><br> <p>Preço</p> <input type="number" step="0.01" value="{{item.Preco}}" name="Preco" placeholder="Preço do Produto"><br><br><br> <p>Preço de Compra</p> <input type="number" step="0.01" value="{{item.Pcompra}}" name="Pcompra" placeholder="Preço de Compra"> <br><br><br> <input type="submit" value="Enviar"> </form>
关键注意点
- 表单输入改用
number类型配合step="0.01",避免非数字输入导致计算错误 - 确保已配置
express.urlencoded解析表单数据,否则req.body会为空 - Sequelize的
update方法返回数组,第一个元素是受影响的行数,可用于判断更新是否成功
内容的提问来源于stack exchange,提问作者grgrafa
相关产品推荐
相关产品推荐

