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

Node.js+msnodesqlv8项目中AJAX POST请求无法执行的问题

问题:AJAX提交表单时Express POST接口无响应

在Node.js项目中使用msnodesqlv8连接SQL Server,已完成包安装及数据库配置且能成功查询数据,但通过AJAX提交表单时,后端app.post('/persons')接口完全未执行,甚至接口内的console.log语句都无输出,请求直接报错。


后端Node.js代码

const express=require('express');
const app=express();
const sql = require('msnodesqlv8');
const bodyParser = require('body-parser');

const connString="Driver={SQL Server Native Client 11.0};Server=myserver;Database=myDB;Uid=muUid;Pwd=myPwd;" 

app.post('/persons',  (req, res) => {
   const formData = req.body;
    try {
        console.log("Posting"); 
        // Create a new person record in the database
        const query=`INSERT INTO persons (name, age, gender) VALUES (${formData.name}, ${  
        formData.age}, ${formData.gender})`;
        console.log(`${formData.name}, ${formData.age}, ${formData.gender} will be written.`);
        sql.query(connString, query,(err,rows)=>{
        
        res.send(rows);
    });  
      
    } catch (err) {
      
      res.send(err);
    }
  });

HTML表单代码

<form id="newRecform"> 
    <div class="row">
        <div class="form-group col-md-6">      
            <label for="name">Name:</label>
            <input class="form-control" type="text" name="name" id="name" required>
        </div>
        <div class="form-group col-md-2">
            <label for="age">Age:</label>
            <input class="form-control" type="number" name="age" id="age" required>
        </div>
    </div>
    <div class="row">
        <div class="form-group col-md-4">
            <label for="gender">Gender:</label>
            <select class="form-control" name="gender" id="gender" required>
                <option value="">-- Select gender --</option>
                <option value="Male">Male</option>
                <option value="Female">Female</option>
                <option value="Other">Other</option>
            </select>
        </div> 
    </div>   
    <br><br><br>
    <button class="btn btn-info btn-sm col-md-2" style="border-radius: 3px;" type="submit">Add Patient</button>
</form>

AJAX提交代码

$("#newRecform").on("submit", function (e) {
    e.preventDefault();
    $.ajax({
        url: 'http://localhost:5001/persons',
        type: 'POST',
        data: $(this).serialize() ,
        success: function (data) {
            alert('New Record added successfully!')
        },
        error: function (jqXHR, textStatus, err) {
            alert('Error ' + textStatus + ', err ' + err)
        }
    });
});

问题排查与解决

1. 未配置请求体解析中间件

后端引入了body-parser但未实际启用,导致Express无法解析AJAX提交的表单数据,甚至可能直接拦截请求,无法进入接口逻辑。在app.post接口定义前添加以下代码:

// 解析表单格式的请求体
app.use(bodyParser.urlencoded({ extended: true }));
// 可选:若后续有JSON格式请求,添加JSON解析
app.use(bodyParser.json());

2. 跨域请求限制

如果前端页面运行端口与后端(5001)不一致,AJAX请求会触发浏览器跨域限制,导致请求无法到达后端。解决方法:

  1. 安装cors包:
npm install cors
  1. 在后端代码中启用跨域中间件:
const cors = require('cors');
app.use(cors());

3. 修复SQL注入漏洞(关键优化)

当前代码直接拼接用户输入到SQL语句中,存在严重SQL注入风险,替换为参数化查询:

const query = 'INSERT INTO persons (name, age, gender) VALUES (?, ?, ?)';
sql.query(connString, query, [formData.name, formData.age, formData.gender], (err, rows) => {
    if (err) {
        console.error('数据库操作失败:', err);
        res.status(500).send('添加记录失败');
        return;
    }
    res.send('记录添加成功');
});

4. 完善异步错误处理

外层try/catch无法捕获sql.query的异步回调错误,需在回调内单独处理错误,避免请求挂起:

sql.query(connString, query, (err, rows) => {
    if (err) {
        console.error('SQL执行错误:', err);
        res.status(500).send(err.message);
        return;
    }
    res.send(rows);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:46:02