【问题标题】:Updating state when database gets updated更新数据库时更新状态
【发布时间】:2021-07-17 02:07:02
【问题描述】:

我的架构看起来像这样:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

//Create Schema
const PhoneNumbersSchema = new Schema({
  phone_numbers: {
    phone_number: 072382838232
    code: ""
    used: false
  },
});

module.exports = PhoneNumbers = mongoose.model(
  "phonenumbers",
  PhoneNumbersSchema
);

然后我得到了一个从 3rd 方应用程序调用的端点,如下所示:

let result = await PhoneNumbers.findOneAndUpdate(
    { country_name: phoneNumberCountry },
    { $set: {"phone_numbers.$[elem1].services.$[elem2].sms_code": 393} },
    { arrayFilters: [ { "elem1.phone_number": simNumberUsed }, { "elem2.service_name": "steam" } ] }, 

基本上,端点会根据数据库中的电话号码更新“代码”。

这就是我从该州检索我的电话号码的方式:

const phonenumbers_database = useSelector((state) => {
    console.log(state);
    return state.phonenumbers ? state.phonenumbers.phone_numbers_details : [];
  });

每次通过 API 调用更改我的数据库中的代码时,我都想自动更新我的状态中的“phonenumbers_database”。

我怎么能做到这一点?

【问题讨论】:

    标签: reactjs react-hooks


    【解决方案1】:

    您可以每 N 秒或使用 change streams 进行轮询并检查数据库

    之后,要通知你的前端应用,你需要使用 WebSockets,检查Socket IO

    【讨论】:

    • 我基本上想在每次数据库中的“代码”发生更改时更新“phonenumbers_database”。我觉得你的方法有点太复杂了,也许?但我会尝试
    • 您有 3 个不同的层,数据库、后端和前端为此,您的后端代码需要了解更改,这就是我建议轮询或类似内容的原因 他们您的后端代码需要发送到前端,因此 WS 是您的最佳选择。你想做的事情听起来很简单,但实际上并不
    【解决方案2】:

    MongoDB 实际上可以通过打开Change Stream 来监视对集合或数据库的更改。

    首先,您将使用 Socket.io 之类的东西从您的 React 应用程序打开一个 WebSocket 到服务器,然后在您的模型上使用 watch for changes

    PhoneNumbers
      .watch()
      .on('change', data => socket.emit('phoneNumberUpdated', data));
    

    您的第三方应用会对您的 API 进行数据库更改,然后更改将自动推送回客户端。

    【讨论】:

    • 我设法让它工作。但我得到的“数据”是一个完整的对象。如何从已更改的对象中仅获取该特定数组?
    • 尝试将对象记录到控制台以检查它以查看您需要的内容。我只能猜测服务器返回的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2020-05-18
    相关资源
    最近更新 更多