使用Node.js从Firestore文档中删除字段

时间:2019-07-16 17:34:56

标签: node.js google-cloud-firestore

我正在尝试从Firestore文档中删除字段,但没有成功。

我已经搜索了收到的错误消息,但可以找到指向我已经在做的事情的链接的几页。我敢肯定这很简单,但此刻我很茫然。

const Firestore = require('@google-cloud/firestore');
const admin = require('firebase-admin');
const FieldValue = admin.firestore.FieldValue;

const firestore = new Firestore({
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
});
const settings = {timestampsInSnapshots: true};
firestore.settings(settings);


var updateDoc = firestore.collection('XXXXXXXX').doc('XXXXXXX').update({
    fieldToBeDeleted: FieldValue.delete()
}); 

我希望该字段被删除,但我收到此错误消息:

Error: Update() requires either a single JavaScript object or an alternating list of field/value pairs that can be followed by an optional precondition. Argument "dataOrField" is not a valid Document. Couldn't serialize object of type "DeleteTransform". Firestore doesn't support JavaScript objects with custom prototypes (i.e. objects that were created via the 'new' operator).
    at WriteBatch.update (XXXXXXXXXX\node_modules\@google-cloud\firestore\build\src\write-batch.js:359:23)
    at DocumentReference.update (XXXXXXXXXX\node_modules\@google-cloud\firestore\build\src\reference.js:387:14)
    at Object.<anonymous> (XXXXXXXXXX)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:191:16)

3 个答案:

答案 0 :(得分:1)

显然,您不能在Cloud SDK和Firebase Admin SDK(包装Cloud SDK)之间混合符号。 Firebase导出自己的符号,该符号不能与直接转到Cloud SDK的调用一起使用。呼叫者必须使用一个或另一个,但不能同时使用。

编辑:

下面是仅使用Cloud SDK而没有Firebase Admin SDK的代码。

=BDH("SX5E 12/20/19 C3600 Index","px_last","03/08/2019")

答案 1 :(得分:0)

我在Cloud Functions中有一个类似的问题,具有写入批处理。最初,我被允许使用Cloud SDK中的docRef = admin.firestore()。collection('XXXXXXX')。doc('XXXXXX')以及FieldValue.delete()。

直到最近我才开始在代码中出现错误,并且直到遇到这个问题和道格的答案时,我才知道我的问题是什么(因为我没有更改代码的这一部分)。 。无论如何,我采用的解决方案有所不同(但仍然符合Doug的建议),并且只使用Admin SDK。

import * as admin from 'firebase-admin';

const firestoreInstance = admin.firestore();
const fieldValue = admin.firestore.FieldValue;
const docRef = firestoreInstance.collection('XXXXXXX').doc('XXXXXXX');
const batch = firestoreInstance.batch();

...

batch.update(docRef, { fieldToBeDeleted: fieldValue.delete() });

return batch.commit();

答案 2 :(得分:0)

我今天有一个类似的错误,原来是版本不匹配的问题。 我的应用程序具有一个正在导入firebase-admin的库,但是它的版本较旧。 FieldValue.delete是从较新版本导入的,并由导入较旧版本firebase-admin的代码保存。这就是为什么无法识别该符号的原因。