如何将客户端JS对象发送至Node服务器并用于MongoDB存储?
解决客户端JS对象传输到Node.js服务器并存入MongoDB的问题
首先,咱们得先搞清楚你之前的问题出在哪:你用$.get发送对象时,jQuery会自动把这个对象转成URL编码的查询字符串(比如title=title1&message=message1),而不是JSON格式。你在服务器端尝试把这个查询字符串当成JSON来解析,肯定会失败——因为它根本不是JSON结构,所以JSON.parse会报错。
下面给你两种可行的解决方案,按需选择:
方案一:继续用GET请求(简化处理)
其实Express已经帮你自动解析了GET请求的查询参数,根本不用自己去处理req._parsedOriginalUrl.query。直接用req.query就能拿到解析好的对象。
客户端代码(不用改)
var myobj = {}; myobj.title = "title1"; myobj.message = "message1"; $.get('/createA', myobj, function(data) { console.log(JSON.parse(data)); });
服务器代码
router.get('/createA', function(req, res, next) { // req.query已经是解析好的JS对象了! const newItem = req.query; // 直接把这个对象存入MongoDB(假设你有对应的Model,比如叫Article) Article.create(newItem) .then(savedItem => { res.json({ success: true, data: savedItem }); }) .catch(err => { res.json({ success: false, error: err.message }); }); });
方案二:改用POST请求(更推荐)
从REST规范来说,创建资源应该用POST请求,而且发送JSON格式的数据会更清晰,也适合更复杂的对象结构。
客户端代码
用$.ajax明确指定发送JSON格式的数据:
var myobj = { title: "title1", message: "message1" }; $.ajax({ url: '/createA', method: 'POST', contentType: 'application/json', // 告诉服务器我们发的是JSON data: JSON.stringify(myobj), // 把JS对象转成JSON字符串 success: function(response) { console.log('保存成功:', response); }, error: function(err) { console.error('保存失败:', err); } });
服务器代码
首先要确保你的Express应用配置了解析JSON请求体的中间件(Express 4.16及以上版本自带,不用额外安装body-parser):
// 在你的app.js/主入口文件里添加 const express = require('express'); const app = express(); // 解析JSON格式的请求体 app.use(express.json());
然后路由代码:
router.post('/createA', function(req, res, next) { // req.body就是客户端发送的JSON解析后的JS对象 const newItem = req.body; // 存入MongoDB Article.create(newItem) .then(savedItem => { res.json({ success: true, data: savedItem }); }) .catch(err => { res.json({ success: false, error: err.message }); }); });
为什么之前的方法失败?
你之前拿到的req._parsedOriginalUrl.query是类似title=title1&message=message1的字符串,这是URL查询参数格式,不是JSON。JSON需要键值对用双引号包裹、逗号分隔(比如{"title":"title1","message":"message1"}),所以你用replace把%22换成单引号后,依然不符合JSON格式,自然无法被JSON.parse解析。
内容的提问来源于stack exchange,提问作者Alex M.
相关产品推荐
相关产品推荐

