首页 > 解决方案 > 将来自 React 的数据推送到 MongoDB 的数组中

问题描述

我想使用 React/NodeJS/MongoDB 将字符串推送到 MongoDB 文档中的数组中,

这是我在 React 中的代码

async function toggleLike() {
      try {
        const dataUser = await axios.post(
          `http://localhost:5000/user/${props.auth.user.id}/add/moviesLiked/${props.match.params.id}`);
        console.log("user ", dataUser);
        forceUpdate();
      } catch (error) {
        console.log(error);
      }

这是我在 NodeJS 中的代码

router.post("/user/:user/add/moviesLiked/:movie", function(req, res) {
  console.log("in api function add");
  mongo.connect(
    url,
    {
      useNewUrlParser: true,
      useUnifiedTopology: true
    },
    (err, client) => {
      if (err) {
        console.error(err);
        return;
      }
      const db = client.db("ofilms-demo");
      const collection = db.collection("users");
      collection.update(
        { _id: req.params.user },
        { $addToSet: { moviesLiked: req.params.movie } }
      );
      console.log("req params user ", req.params.user);
      console.log("req params movie ", req.params.movie);
      client.close();
    }
  );
});

这是 Mongoose 中的用户模型

const UserSchema = new Schema({
  moviesLiked: Array,
  moviesDisliked: Array,
});

我所有的 console.log 都显示正确,但我仍然没有将数据推送到数组中,

有人可以帮助我吗?谢谢,

标签: reactjsmongodb

解决方案


collection.update是异步的,因此您需要等待它完成执行,然后再关闭与 Mongo 的连接并向客户端返回响应。

update您可以通过将调用传回方法或使用async/awaitjavascript 功能来等待更新操作完成。

传递回调函数:

router.post("/user/:user/add/moviesLiked/:movie", function (req, res) {
  mongo.connect(
    url,
    {
      useNewUrlParser: true,
      useUnifiedTopology: true
    },
    (err, client) => {
      if (err) {
        console.error(err);
        return;
      }
      const db = client.db("ofilms-demo");
      const collection = db.collection("users");
      collection.update(
        { _id: req.params.user },
        { $addToSet: { moviesLiked: req.params.movie } },
        function (error, result) { // The callback function
          if (error) {
            // Handle the error and send a respone to the user
          } else {
            // Make use of the result and send a response to the user
          }
          client.close();
        }
      );
    }
  );
});

使用async/await

// Add the async keyword before declaring the function
router.post("/user/:user/add/moviesLiked/:movie", async function (req, res) {
  mongo.connect(
    url,
    {
      useNewUrlParser: true,
      useUnifiedTopology: true
    },
    (err, client) => {
      if (err) {
        console.error(err);
        return;
      }
      const db = client.db("ofilms-demo");
      const collection = db.collection("users");
      try {
        // Add the await keyword before the update call
        await collection.update(
          { _id: req.params.user },
          { $addToSet: { moviesLiked: req.params.movie } },
        );
        // Send response to your client
      } catch (err) {
        // Handle any possible error
      }
      client.close();
      console.log("req params user ", req.params.user);
      console.log("req params movie ", req.params.movie);
    }
  );
});

推荐阅读