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请求会触发浏览器跨域限制,导致请求无法到达后端。解决方法:
- 安装
cors包:
npm install cors
- 在后端代码中启用跨域中间件:
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
相关产品推荐
相关产品推荐

