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

Node+Express+Pug开发自行车管理应用更新接口返回404错误求解

问题根因与修复方案

1. 404错误直接原因:表单action地址不匹配路由规则

你配置的POST更新路由规则是/bicicletas/:id/update,需要携带自行车id参数,但你现在表单写的action是bicicletas/update,既没有携带id参数,也没有使用绝对路径,所以Express找不到对应路由,返回404。
修复方式:把update.pug里的form标签替换为如下代码:

form(action='/bicicletas/' + bici.id + '/update', method='post')

开头加/是为了使用绝对路径,避免当前页面路径导致提交地址拼接错误。

2. 其他待修复的逻辑问题

  • 下拉框无默认选中值

现在颜色、型号下拉框打开编辑页面时不会默认选中当前自行车的对应属性,需要修改下拉框逻辑:

select(name='color', id='color', required)
    each val in ['--select--','Blanco' , 'Negro' , 'Rojo','Verde']
        option(value=val selected= val === bici.color)=val
br
select(name='modelo', id='modelo', required)
    each val in ['--select--','Ruta' , 'Cross' , 'Montian','Turismo']
        option(value=val selected= val === bici.modelo)=val
  • 输入框id属性重复

纬度、经度的输入框id都写为id,和ID输入框冲突,不符合HTML规范,修改为:

label(for='lat') Latitud:
input#lat(type='text' name='lat' value= bici.ubicacion[0] )
br
label(for='lng') Longitud:
input#lng(type='text' name='lng' value= bici.ubicacion[1] )
  • 可选安全优化

当前update_post方法用表单提交的req.body.id来定位要更新的自行车,容易被用户篡改表单id修改其他车辆数据,可以改成用路由参数里的id:

exports.update_post = function (req, res) {
  // 优先用路由参数的id,避免表单篡改
  var bici = new Bicicleta(req.params.id, req.body.color, req.body.modelo);
  bici.ubicacion = [req.body.lat, req.body.lng];
  Bicicleta.update(bici);
  res.redirect("/bicicletas");
};

内容的提问来源于stack exchange,提问作者Mar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:15:02