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

Node.js服务端如何向Pug客户端回传AJAX请求的过滤后数据?

问题修复方案

现有代码问题梳理

  • AJAX请求参数格式错误:data: {form.serialize()} 写法不符合要求,form.serialize()本身已经是符合x-www-form-urlencoded格式的字符串,不需要额外包裹对象
  • 未配置AJAX响应回调:服务端返回数据后,客户端没有对应的接收逻辑处理过滤后的数据,无法完成页面局部更新
  • 服务端接口逻辑不匹配:当前接口直接返回渲染后的完整HTML页面,不符合AJAX请求需要JSON格式数据的要求,且未使用前端提交的选中值做数据过滤
  • 未配置POST参数解析:如果项目未开启express的body解析,服务端无法正常获取前端提交的表单参数

分步修改代码

1. 修复Pug中的AJAX代码

script.
        $(function() {
            $('#form1').submit(function(event) {
                event.preventDefault();
                var form = $(this);
                $.ajax({
                    type: form.attr('method'),
                    url: form.attr('action'),
                    data: form.serialize(), // 修正参数格式
                    dataType: 'json', // 声明预期返回格式为JSON
                    success: function(filteredData) {
                        // 替换为实际的页面更新逻辑,以下为渲染下拉框的示例代码
                        const selectEl = $('#替换为你的下拉框实际ID');
                        selectEl.empty();
                        filteredData.forEach(item => {
                            // 替换value和展示文本为你实际的字段名
                            selectEl.append(`<option value="${item.value}">${item.label}</option>`)
                        })
                    },
                    error: function(err) {
                        console.log('请求异常', err)
                    }
                });
            });
        });

2. 确认express开启POST参数解析

在项目入口app.js中确保存在以下配置:

const express = require('express');
const app = express();
// 解析POST表单参数
app.use(express.urlencoded({ extended: true }));
// 如果需要接收JSON格式参数可额外添加以下配置
app.use(express.json());

3. 调整路由和Controller逻辑

如果原路由需要同时负责首次页面渲染和AJAX数据返回,可拆分请求类型:

路由文件修改

const express = require("express");
const main_controller = require("../../controllers/main-controller");
const data_model = require('../../models/data-model');

const router = express.Router();

// GET请求负责首次渲染页面,加载全量数据
router.get('/form', (req, res) => {
    data_model.find((err, data) => {
        res.render("./customer/form1", {
            pageTitle: "Form1",
            data: data
        });
    });
})
// POST请求负责处理AJAX提交,返回过滤后的JSON数据
router.post('/form', main_controller.Send);

module.exports = router;

Controller文件修改

const data_model = require('../../models/data-model');

exports.Send = (req, res, next) => {
    // 替换为你下拉框实际的name属性值,获取用户选中的参数
    const selectedVal = req.body.替换为下拉框实际name属性;
    // 替换为你实际的数据库过滤规则
    const filter = { 过滤字段名: selectedVal };
    data_model.find(filter, (err, filteredData) => {
        if (err) return res.status(500).json({msg: '数据查询失败'});
        // 直接返回JSON格式的过滤后数据,不渲染页面
        res.json(filteredData);
    });
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:57:05