You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:14:52