【问题标题】:how to read specific data from realtime database in node.js如何从 node.js 中的实时数据库中读取特定数据
【发布时间】:2021-08-20 17:08:37
【问题描述】:

我正在处理 API 获取请求。我创建了一个 POST 请求以在 firebase 实时数据库中添加数据。代码如下:

// CREATE POST
app.post("/post", (req, res) => {
  let key;

firebase.auth().onAuthStateChanged((user) => {
if (user) {
  // User is signed in.

  var newPost = firebase.database().ref("posts/");

  var myPost = newPost.push({
    createdBy: user.uid,
    from: req.body.from,
    to: req.body.to,
    duration: req.body.duration,
    comments: req.body.comments,
  });

  res.send(newPost);
  const postId = myPost.key;
  console.log(postId);
} else {
  // No user is signed in.
  res.status(404).send("No user is signed in right now!");
}
  });
});

现在,为了得到一个具体的帖子,我写了如下代码:

// GET SPECIFIC POST
app.get("/post/:id", (req, res) => {

  let response;
  firebase
    .database()
    .ref("posts/" + req.params.id)
    .on("value", (snapshot) => {
      response = snapshot.val();
    });
  res.send(response);
});

我是 Firebase 的新手,所以我真的不知道如何获得特定的帖子。请帮帮我

【问题讨论】:

    标签: node.js api firebase-realtime-database request crud


    【解决方案1】:

    对 Firebase 的调用是异步的,因为它们需要调用服务器。当该调用发生时,您的主要代码将继续。然后当数据可用时,使用来自服务器的数据调用您的回调。

    现在你的res.send(response)response = snapshot.val() 被调用之前运行。异步 API 的规则很简单:任何需要数据的代码都需要在回调内部,或者从那里调用。

    所以在你的情况下:

    app.get("/post/:id", (req, res) => {
      firebase
        .database()
        .ref("posts/" + req.params.id)
        .once("value")
        .then((snapshot) => {
          res.send(snapshot.val());
        });
    });
    

    您会注意到我也从 on 更改为 once,因为您只关心获取一次值(而不是附加一个永久侦听器来监视数据库的更改)。

    处理异步 API 是一个常见的绊脚石,因此我建议花一些时间阅读这些答案以了解更多信息:

    【讨论】:

    • 我尝试了您的解决方案。谢谢你,但问题是当我在邮递员上以localhost:4242/post/MbC2aBbai02KKYUus1s 运行它时,其中哈希码是帖子的关键,我的回复中没有得到任何东西
    • 您缺少该 URL 中键的 -
    • 这只是呈现所有帖子,就好像我正在创建一个 GET 请求来显示所有帖子
    • 听起来你的req.params.id 是空的。您可能想console.log(req.params.id) 进行验证。
    【解决方案2】:

    我只是这样做了:

    app.get("/post/:id", (req, res) => {
    
    var key = req.params.id;
      console.log(key);
    
     firebase
        .database()
        .ref("posts")
        .child(key)
        .get()
        .then((snapshot) => {
          res.send(snapshot.val());
        });
    });
    

    这解决了问题

    【讨论】:

      猜你喜欢
      • 2021-08-13
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 2021-09-20
      • 2022-01-22
      • 1970-01-01
      • 2021-08-22
      • 2019-09-20
      相关资源
      最近更新 更多