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

如何通过Node.js+Express将实时JSON数据存入MongoDB?

解决方法:将JSON字符串存入MongoDB

首先咱们得明确一点:MongoDB本身是文档型数据库,更适合存储JavaScript对象(而非JSON字符串),这样后续查询、操作数据会更方便。不过如果你确实需要存储字符串,也完全可以实现。下面一步步帮你搞定:

1. 安装必要依赖

先确保你安装了express和mongoose(MongoDB的Node.js驱动,用它操作数据库更便捷):

npm install express mongoose

2. 连接MongoDB数据库

在代码里先建立和MongoDB的连接,记得替换成你自己的数据库地址:

import express from 'express';
import mongoose from 'mongoose';

const app = express();
app.use(express.json()); // 解析JSON请求体,处理POST请求时会用到

// 连接MongoDB
mongoose.connect('mongodb://localhost:27017/your-database-name')
  .then(() => console.log('成功连接MongoDB!'))
  .catch(err => console.error('MongoDB连接失败:', err));

3. 定义数据模型(Schema & Model)

我们需要先定义数据结构,告诉MongoDB要存什么样的数据。这里分两种情况:

情况1:存储解析后的对象(推荐)

这样存的话,数据是嵌套文档,方便后续查询内部字段:

// 定义Schema
const recordSchema = new mongoose.Schema({
  content: Object, // 存储解析后的JavaScript对象
  createdAt: { type: Date, default: Date.now } // 自动添加创建时间
});

// 创建Model
const Record = mongoose.model('Record', recordSchema);

情况2:直接存储JSON字符串

如果你确实需要存原始的JSON字符串,把Schema里的content类型改成String即可:

const recordSchema = new mongoose.Schema({
  content: String, // 直接存JSON字符串
  createdAt: { type: Date, default: Date.now }
});

const Record = mongoose.model('Record', recordSchema);

4. 定时保存数据到数据库

你提到每60秒自动接收数据并转成JSON字符串data_record,我们可以在定时任务里把数据存入数据库:

// 模拟每60秒接收数据的逻辑(替换成你实际的数据源)
setInterval(async () => {
  // 这里是你实际获取数据的地方
  const rawData = { temperature: 25.6, humidity: 60, timestamp: Date.now() };
  const data_record = JSON.stringify(rawData);

  try {
    // 情况1:解析成对象后保存(推荐)
    const parsedData = JSON.parse(data_record);
    const newRecord = new Record({ content: parsedData });
    
    // 情况2:直接保存字符串(如果选了情况2的Schema)
    // const newRecord = new Record({ content: data_record });

    await newRecord.save(); // 异步保存到数据库
    console.log('数据保存成功:', newRecord);
  } catch (err) {
    console.error('保存数据出错:', err);
  }
}, 60000); // 60秒间隔

5. 优化你的POST路由

原来的路由只是返回data_record,现在可以让它也支持接收外部数据并存入,或者返回最近保存的记录:

app.post('/recording/ttn', async (req, res) => {
  // 如果你需要通过这个接口接收外部数据并存入:
  // const incomingData = req.body;
  // const newRecord = new Record({ content: incomingData });
  // await newRecord.save();

  // 返回当前的data_record或者保存成功的信息
  res.status(200).json({
    message: '数据已处理',
    recordedData: data_record
  });
});

// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`服务器运行在端口 ${PORT}`));

关键注意事项

  • 为什么推荐解析成对象? 如果你直接存JSON字符串,后续要查询temperature这样的字段会非常麻烦,而存对象的话,可以直接用Record.findOne({"content.temperature": 25.6})这样的查询语句。
  • 异步操作处理:数据库操作是异步的,所以一定要用async/await或者.then()来处理,避免出现未处理的Promise错误。
  • 错误捕获:一定要捕获数据库操作的错误,避免程序崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:03:28