我正在使用mongodb,nodejs等为我的移动应用程序制作一个管理页面。我正在尝试将现有的 json 文件插入到 mongodb 集合中。我尝试了 mongoimport,但它只是不起作用(我通读并尝试了几次关于它的堆栈溢出讨论)。所以我发现我可以通过 http POST 发送它并使用 insert()。
我有三个本地主机服务器正在运行:mongodb,应用程序服务器和网站管理页面
JSON 文件如下所示:
{"data_version":1,"drivers_teams":{"drivers":{"4":{"name":"Hofer","firstname": ... }}}
客户端发布
$.getJSON("initialData.json", function(json) {
$.ajax({
url: 'localhost:3080/client_data',
type: 'POST',
data: json,
success: function(res) {
console.log(res);
}.bind(this),
error: function(xhr, status, err) {
console.error(url, status, err.toString());
}.bind(this)
});
}.bind(this));
服务器开机自检
app.use(bodyParser.json({limit: '1000kb', parameterLimit: 5000}));
app.use(bodyParser.urlencoded({limit: '1000kb', parameterLimit: 5000, extended: false}));
app.post('/client_data/', (req, res) => {
const db = req.db;
const collection = db.get('collection');
collection.insert(req.body, function (err, doc) {
if (err) {
res.status(500).send('Invalid request');
return;
}
res.send('ok');
});
});
到目前为止一切顺利,但是在我设法插入数据并询问服务器您得到了什么之后? 我得到:
{"_id":"57872f9fe51246dc1b3bbc93","data_version":"1","drivers_teams[drivers][4][name]":"Hofer","drivers_teams[drivers][4][firstname] ... }}}
我不能再使用这些数据了。所以问题:当嵌套的 json 来自 http 请求正文时,我如何按原样插入它?
编辑
好的,弄清楚了如何执行 AS-IS 插入()。而不是 http.post 我将 json 直接加载到集合中;
服务器
import mydata from './initialData.json';
...
collection.insert(mydata, function (err, doc) { ... });
仍然对我在请求正文中做错了什么感到困惑。因为现在如果我做收集.更新();从客户端更新的元素显然被括号符号搞砸了。
解决方案是更改 url 编码的 bodyParser 选项
app.use(bodyParser.urlencoded({ extended: true }));
至少对我来说,这确实是违反直觉的,因为我正在寻找与 JSON 相关的问题,而不是表单......唯一的背面是一切都是字符串而不是它们的真实类型,但一旦我走到这一步,我就不在乎了。
编辑
为了在服务器端获取数据类型,我需要 JSON.stringify(data) 并在 POST 选项中添加 contentType:"application/json"
post: function(data) {
$.ajax({
url: url,
type: 'POST',
data: JSON.stringify(data),
contentType: 'application/json',
success: function(res) {
console.log(res)
}.bind(this),
error: function(xhr, status, err) {
console.error(url, status, err.toString());
}.bind(this)
});
},