req.body解析post数据出错的问题

本文介绍了一个关于Ajax向Node.js后端发送JSON数据时出现解析错误的问题,并详细解释了如何通过设置contentType属性来解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在用ajax向后台发送数据的时候出现了解析出错的情况,环境为nodejs+express4.x

app.html

<script type="text/javascript">
var userdata={
        username:"root",
        password:"root",
      };
      var userJSON=JSON.stringify({data:userdata});
      console.log(userJSON);
      $.ajax({
        url:"/submit",
        type:"post",
        data:userJSON,
        datatype:"json",
        success: function(data){
          data=JSON.parse(data);
          var html = template('test',data); 
          $("#tableshow").html(html);
        },
        error: function(data){
          console.log("error"+data.message);
        }
      });
</script>

app.js

var bodyParser  = require('body-parser');
...
app.use(bodyParser.json());
...
app.post('/submit',function(req,res,next){
    console.log(req.body);
    res.status(200);
});
//打印req.body如下
//{ '{"data":{"username":"root","password":"root"}}': '' }
//正确的应该为
//{ data: { username: 'gang', password: 'root' } }

ERROR,req.body把传过来的字符串解析为了键值对数据,但是Express4.x自带的模块body-parser应该能够正确解析json,这是为什么呢?查阅很多资料,明白了。

因为在$.ajax函数里面还有一个contentType属性,用来设置传输数据的类型,不设置的时候它默认为”application/x-www-form-urlencoded”,所以body-parser识别不了,所以在ajax里添上一句contentType:’application/json’(别忘了逗号),问题解决。

$.ajax({
        url:"/submit",
        type:"post",
        data:userJSON,
        contentType:'application/json',
        datatype:"json",
        success: function(data){
          data=JSON.parse(data);
          var html = template('test',data); 
          $("#tableshow").html(html);
        },
        error: function(data){
          console.log("error"+data.message);
        }
      });

以上。

document.addEventListener('DOMContentLoaded', function() { const form = document.getElementById('registration-form'); form.addEventListener('submit', function (event) { event.preventDefault(); // 阻止表单提交 const name = document.getElementById('name').value; const password = document.getElementById('password').value; const email = document.getElementById('email').value; console.log('注册信息:'); console.log('用户名:', name); console.log('密码:', password); console.log('邮箱:', email); }); }); const express = require('express'); const bodyParser = require('body-parser'); const mssql = require('mssql'); const app = express(); app.use(bodyParser.urlencoded({ extended: false })); // 创建与数据库的连接 const connection = mssql.createConnection({ server: '192.168.10.223', user: 'sa', password: 'Servo01', database: 'demo' }); // 连接数据库 connection.connect(function (err) { if (err) { console.error('Error connecting to database:', err); return; } console.log('Connected to database!'); }); // 处理注册页面的 POST 请求 app.post('/', function (req, res) { const name = req.body.name; const password = req.body.password; const email = req.body.email; console.log('注册信息:'); console.log('用户名:', name); console.log('密码:', password); console.log('邮箱:', email); // 将数据保存到数据库 const query = `INSERT INTO username (name, password, email) VALUES ('${name}','${password}','${email}')`; const request = new mssql.Request(); connection.query(query, function (err, res) { if (err) { console.error('Error saving data to database:', err); return; } console.log('数据已保存到数据库!'); }); res.send('注册成功!'); }); app.listen(3000, function () { console.log('Server is running on port 3000'); });为啥username数据表中没有注册页面的数据
07-14
const express = require('express'); const cors = require('cors'); const sqlite3 = require('sqlite3').verbose(); const path = require('path'); // 创建服务器 const app = express(); app.use(express.json()); // 修复CORS配置 - 添加详细配置 app.use(cors({ origin: '*', methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization'], credentials: true })); // 处理预检请求 app.options('*', cors()); // 连接SQLite数据库 const db = new sqlite3.Database('./archive.db', (err) => { if (err) { console.error('数据库连接错误:', err.message); } else { console.log('成功连接SQLite数据库'); // 初始化档案表 db.run(`CREATE TABLE IF NOT EXISTS archives ( id INTEGER PRIMARY KEY AUTOINCREMENT, fileNumber TEXT NOT NULL, documentNumber TEXT, responsiblePerson TEXT, title TEXT NOT NULL, date TEXT, projectDate TEXT, securityLevel TEXT, pages INTEGER, retentionPeriod TEXT, carrierForm TEXT, notes TEXT, type TEXT NOT NULL, createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(fileNumber, type) )`); } }); // 获取档案数据 (添加错误处理) app.get('/api/archives', (req, res) => { const type = req.query.type || 'document'; db.all('SELECT * FROM archives WHERE type = ? ORDER BY createdAt DESC', [type], (err, rows) => { if (err) { console.error('数据库查询错误:', err); res.status(500).json({ error: '数据库查询失败' }); } else { res.json(rows); } }); }); // 添加新档案 app.post('/api/archives', (req, res) => { const { fileNumber, documentNumber, responsiblePerson, title, date, projectDate, securityLevel, pages, retentionPeriod, carrierForm, notes, type } = req.body; // 验证必填字段 if (!fileNumber || !title || !type) { return res.status(400).json({ error: '档号、题名和类型为必填项' }); } const sql = ` INSERT INTO archives ( fileNumber, documentNumber, responsiblePerson, title, date, projectDate, securityLevel, pages, retentionPeriod, carrierForm, notes, type ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) `; const values = [ fileNumber, documentNumber || null, responsiblePerson || null, title, date || null, projectDate || null, securityLevel || null, pages ? parseInt(pages) : null, retentionPeriod || null, carrierForm || null, notes || null, type ]; db.run(sql, values, function(err) { if (err) { // 处理唯一键冲突(档号重复) if (err.code === 'SQLITE_CONSTRAINT') { return res.status(409).json({ error: '该档号已存在,请使用其他档号' }); } return res.status(500).json({ error: err.message }); } res.status(201).json({ id: this.lastID, ...req.body }); }); }); // 更新档案 app.put('/api/archives/:id', (req, res) => { const id = req.params.id; const { fileNumber, documentNumber, responsiblePerson, title, date, projectDate, securityLevel, pages, retentionPeriod, carrierForm, notes, type } = req.body; // 验证必填字段 if (!fileNumber || !title || !type) { return res.status(400).json({ error: '档号、题名和类型为必填项' }); } const sql = ` UPDATE archives SET fileNumber = ?, documentNumber = ?, responsiblePerson = ?, title = ?, date = ?, projectDate = ?, securityLevel = ?, pages = ?, retentionPeriod = ?, carrierForm = ?, notes = ?, type = ? WHERE id = ? `; const values = [ fileNumber, documentNumber || null, responsiblePerson || null, title, date || null, projectDate || null, securityLevel || null, pages ? parseInt(pages) : null, retentionPeriod || null, carrierForm || null, notes || null, type, id ]; db.run(sql, values, function(err) { if (err) { // 处理唯一键冲突(档号重复) if (err.code === 'SQLITE_CONSTRAINT') { return res.status(409).json({ error: '该档号已存在,请使用其他档号' }); } return res.status(500).json({ error: err.message }); } if (this.changes === 0) { return res.status(404).json({ error: '档案未找到' }); } res.json({ id: id, ...req.body }); }); }); // 删除档案 app.delete('/api/archives/:id', (req, res) => { const id = req.params.id; db.run('DELETE FROM archives WHERE id = ?', [id], function(err) { if (err) { return res.status(500).json({ error: err.message }); } if (this.changes === 0) { return res.status(404).json({ error: '档案未找到' }); } res.json({ success: true }); }); }); // 批量导入档案 app.post('/api/archives/batch-import', (req, res) => { const data = req.body.data || []; if (data.length === 0) { return res.status(400).json({ error: '没有提供导入数据' }); } let insertedCount = 0; let skippedCount = 0; let processed = 0; // 开始事务 db.serialize(() => { db.run('BEGIN TRANSACTION'); data.forEach(item => { const { fileNumber, documentNumber, responsiblePerson, title, date, projectDate, securityLevel, pages, retentionPeriod, carrierForm, notes, type } = item; // 检查是否已存在相同档号和类型的档案 db.get('SELECT id FROM archives WHERE fileNumber = ? AND type = ?', [fileNumber, type], (err, row) => { if (err) { // 错误处理 return; } if (row) { // 跳过已存在的档案 skippedCount++; checkComplete(); return; } // 插入新档案 const sql = ` INSERT INTO archives ( fileNumber, documentNumber, responsiblePerson, title, date, projectDate, securityLevel, pages, retentionPeriod, carrierForm, notes, type ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) `; const values = [ fileNumber, documentNumber || null, responsiblePerson || null, title, date || null, projectDate || null, securityLevel || null, pages ? parseInt(pages) : null, retentionPeriod || null, carrierForm || null, notes || null, type ]; db.run(sql, values, function(err) { if (!err) { insertedCount++; } checkComplete(); }); }); }); function checkComplete() { processed++; if (processed === data.length) { db.run('COMMIT', (err) => { if (err) { return res.status(500).json({ error: '导入失败' }); } res.json({ insertedCount, skippedCount }); }); } } }); }); // 启动服务器 const port = 3000; app.listen(port, () => { console.log(`服务器运行在 http://localhost:${port}`); }); 运行这个js文件报错,throw new TypeError(`Missing parameter name at ${i}: ${DEBUG_URL}`);
07-24
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值