从mongodb获取实时数据

问题描述 投票:0回答:1

我正在尝试创建一个API来从mongodb获取最新文档并将其显示在浏览器中。仅当刷新浏览器时才显示最新文档。我正在尝试使用此端点创建一个带有温度、湿度和 EC 值自动更新的仪表板。 这是我使用 Node.js 的 API 代码。

const app = express();

//middle ware
app.use(express.json());
app.use(cors());

const port = ;

// to specify in which db to save write the DB name before "?retryWrites"
const uri = '';


const sensorSchema = { 
    temperature: Number,
    humidity: Number,
    ec: Number,
    date: Date,
};

const Sensor = new mongoose.model("Sensor",sensorSchema); 

app.listen(port,()=>
{
    console.log(`Server started at http://localhost:${port}`)
});

const pipeline = [ { $match: { runtime: { $lt: 15 } } } ];

app.get('/get-readings', async (req, res) => {
    try {
        // Find the latest sensor reading
        const latestDoc = await Sensor.findOne({}, {}, { sort: { date: -1 } });
        res.json(latestDoc)

        const update = Sensor.watch(pipeline);

        for (const change of update) {

            console.log("Received change:\n", change);
            //res.json(change)

        }

    } catch (error) {
        console.error('Error fetching sensor data:', error);
        res.status(500).json({ error: 'Internal server error' });
    }
});


const connectDB  = async () =>
{
    try {
        await mongoose.connect(uri);
        console.log('MongoDB connected');
    } catch (error) {
        console.log(error);
    }
}
connectDB();

最新文档如下所示:

使用 MongoDB。watch() 有效,但前提是我 console.log 最新文档。如果我取消注释 res.json(change),这将触发错误“在将标头发送到客户端后无法设置标头”。

任何有关如何处理的帮助或指示将不胜感激。

javascript node.js mongodb express
1个回答
0
投票

您在这里有几个选择。

  1. 定期轮询
  2. 套接字/TCP 流
  3. 网络钩子

我建议对此进行一些独立阅读,但本质上它们都是让您更频繁地从某些服务接收数据的方法。

最容易实现的方法是定期轮询——您可以按一定时间间隔运行客户端代码。

如果您需要客户端和服务器之间进行大量通信和快速反馈,则套接字方法将是最好的。查看 https://nodejs.org/docs/latest/api/net.html#netcreateconnection。您还可以看看他的方法https://nodejs.org/docs/latest/api/http2.html#server-side-example

Webhook 仅适用于服务器到服务器的通信,因为它需要您公开端点来接收“推送”给您的数据

© www.soinside.com 2019 - 2024. All rights reserved.