NodeJS 未处理的拒绝(FirebaseError):没有要更新的文档

aiazj4mn  于 11个月前  发布在  Node.js
关注(0)|答案(4)|浏览(143)

我还是一个新手,所以请原谅我!我已经跟随youtube课程构建了一个note应用程序,并获得了一个工作基础,但我现在在删除firebase中的笔记时会随机出现这个错误,希望有人能够发现这里的烹饪!
“未处理的拒绝(FirebaseError):没有要更新的文档:projects/speakle-dc 94 b/databases/(默认)/documents/notes/GdWPrQNxR 3 Z9 TFMWmqOZ”
它像这样引用节点模块:screenshot of the error in chrome
我与firebase交互的代码看起来像这样:

componentDidMount = () => {
    firebase
      .firestore()
      .collection('notes')
      .onSnapshot(serverUpdate => {
        const notes = serverUpdate.docs.map(_doc => {
          const data = _doc.data();
          data['id'] = _doc.id;
          return data;
        });
        console.log(notes);
        this.setState({ notes: notes });
      });
  }

  selectNote = (note, index) => this.setState({ selectedNoteIndex: index, selectedNote: note });
  
  noteUpdate = (id, noteObj) => {
    firebase
      .firestore()
      .collection('notes')
      .doc(id)
      .update({
        title: noteObj.title,
        body: noteObj.body,
        timestamp: firebase.firestore.FieldValue.serverTimestamp()
      });
  }
  
  newNote = async (title) => {
    const note = {
      title: title,
      body: ''
    };
    const newFromDB = await firebase 
      .firestore()
      .collection('notes')  
      .add({
        title: note.title,
        body: note.body,
        timestamp: firebase.firestore.FieldValue.serverTimestamp()
      });
    const newID = newFromDB.id;
    await this.setState({ notes: [...this.state.notes, note] });
    const newNoteIndex = this.state.notes.indexOf(this.state.notes.filter(_note => _note.id === newID)[0]);
    this.setState({ selectedNote: this.state.notes[newNoteIndex], selectedNoteIndex: newNoteIndex });
  }

  deleteNote = async (note) => {
    const noteIndex = this.state.notes.indexOf(note);
    await this.setState({ notes: this.state.notes.filter(_note => _note !== note) })
    if(this.state.selectedNoteIndex === noteIndex) {
      this.setState({ selectedNoteIndex: null, selectedNote: null});
    } else {
      this.state.notes.lenght > 1 ? 
      this.selectNote(this.state.notes[this.state.selectedNoteIndex - 1], this.state.selectedNoteIndex - 1) : 
      this.setState({ selectedNoteIndex: null, selectedNote: null });
    }

    firebase 
      .firestore()
      .collection('notes')
      .doc(note.id)
      .delete()
      .then(function() {
        console.log("Document successfully deleted!");
    }).catch(function(error) {
        console.error("Error removing document: ", error);
    });
  }
}

字符串

zdwk9cvp

zdwk9cvp1#

这只是意味着没有该名称的文档要上传。您可以使用set()add()来添加该文档,因为它不存在。

noteUpdate = (id, noteObj) => {
    firebase
      .firestore()
      .collection('notes')
      .doc(id)
      .update({
        title: noteObj.title,
        body: noteObj.body,
        timestamp: firebase.firestore.FieldValue.serverTimestamp()
      });
  }

字符串
将上面的代码替换为

noteUpdate = (id, noteObj) => {
    firebase
      .firestore()
      .collection('notes')
      .doc(id)
      .add({
        title: noteObj.title,
        body: noteObj.body,
        timestamp: firebase.firestore.FieldValue.serverTimestamp()
      });
  }


noteUpdate = (id, noteObj) => {
    firebase
      .firestore()
      .collection('notes')
      .doc(id)
      .set({
        title: noteObj.title,
        body: noteObj.body,
        timestamp: firebase.firestore.FieldValue.serverTimestamp()
      });
  }

50few1ms

50few1ms2#

我只在Cloud Functions中使用过类似的东西,在编写用于执行某些操作的端点时,我遇到了下面引用的错误。
我试图读取一个集合中的文档,如果它存在,我试图将一个新文档写入另一个集合,所以这是一种嵌套代码。
我的一段代码。

const firstDocRef = db.collection('myFirstCollection').doc('myDocName');
    const existDoc = firstDocRef.get()
    .then((resDoc)=>{
        if(resDoc.exists)
        {
            db.collection('mySecondCollection').add({
                .
                .
                .
                .
                .
                orderCreatedAt:Firestore.FieldValue.serverTimestamp()
            })
            .then((new_doc)=>{
                return res.status(200);
                // return 200 ok what we were trying to achieve has completed.
            })
            .catch(()=>{
                console.log("Log, as write failed somehow");
                return res.status(500);
                // return a 500 internal server error occurred
            });
        }
        else
        {
            console.log("My first condition wasn't met, so logged it");
            return res.end();
            // properly terminate the processing of request
        }
    });
    /*.catch((err)=>{
        console.log("Our first doc presence check couldn't complete and hence I arrived here, log it");
        res.writeHead(500);
        return res.end();
        // again give back 500 to client
    });*/

字符串
UnhandledPromiseRejection警告:参考错误:未定义Firestore UnhandledPromiseRejectionWarning:未处理的promise rejection。此错误可能是由于在没有catch块的情况下抛出了一个blog函数而引起的
现在我也是Firebase的新手,但我遇到了这个问题,并以某种方式解决了它。
所以如果我在get()文档中放入catch块,我不会得到上面的错误。奇怪吧!
通过注解删除catch块。得到此错误。
现在,这是一个混乱的错误,它说捕捉不存在,但我们故意这样做。
所以我开始搜索,在这里遇到了这个关于堆栈溢出的问题,发现它仍然没有答案。我自己搜索并阅读了文档。
我想告诉你的是,这并不是因为什么火之安全规则,或者其他什么,因为我在寻找答案的时候,也遇到了一些关于这些概念的猜测。

我们在这里做的共同点是,我们试图在FireStore实现ServerTimeStamp

我想把你的通知我的进口在我的节点云函数代码。

const functions = require('firebase-functions');
const express = require('express');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const db = admin.firestore();


所以你看,我正在使用新的方式来获得使用Firestore的权限,因为我试图建立一个云功能。
下面是Google提供的文档参考:单击here
上述API参考建议的正确语法是

Firestore.FieldValue.serverTimestamp()


它是罪魁祸首,它没有提供任何时间戳,如果没有catch块未处理的promise错误发生,并且在调试时没有显示错误,它就不工作。
我是这样做的,解决方案部分:
即使在我的Node程序中导入了这些内容之后,我还是导入了以下内容:

const {Firestore} = require('@google-cloud/firestore');


现在我所做的就是在timestamp字段中使用语句,

Firestore.FieldValue.serverTimestamp()


正如前面提到的,甚至使用了一个catch块,以防在生产过程中发生任何其他问题。这就是使用db常量来完成所有数据库transmitting的事情,并且对于serverTimeStamp,我必须引入新的导入。
它工作了,我猜require('@google-cloud/firestore')语句导入为{FireStore}带来了FieldValue所需的所有东西,用作引用。
我希望它可以帮助任何新的人寻找它,并节省了很多时间,我浪费了寻找一个解决方案。
我已经通过在firebase模拟器上运行cloud函数验证了它。

cclgggtu

cclgggtu3#

你可以简单地这样做

1.得到它
1.如果它存在:你更新它
1.如果它不存在,你设置它。

const docRef = this.db.collection("users_holdings").doc(userId);
docRef.get().subscribe((doc) => {
    if (doc.exists) {
        docRef.update({
            stockHoldings: stockHoldings,
        });
    } else {
        docRef.set({
            stockHoldings: stockHoldings,
        });
    }
});

字符串

nuypyhwy

nuypyhwy4#

Unhandled Rejection (FirebaseError): No document to update:

字符串
你可以处理拒绝:

updateDoc(routeDocumentRef, {
     // Updated Object 
  }).catch((e) => {
    if (e.code === 'not-found') {
       // Create a new note
    }
     // Throw an actual error. 
  });
}


你可以尝试更新注解,如果它失败到No document found,你可以检查抛出的错误代码。如果抛出,你可以创建它。

相关问题