如何检查对象是否为 instanceof firebase.firestore.FieldValue
How to check if object is instanceof firebase.firestore.FieldValue
在 firebase js 网络客户端上:
var fv = firebase.firestore.FieldValue;
var sv = fv.serverTimestamp();
sv instanceof fv //true
而在节点中:
var fb = require('firebase-admin');
var fv = fb.firestore.FieldValue;
var sv = fv.serverTimestamp();
sv instanceof fv //false
我不知道为什么会出现这种不一致。我如何判断一个对象是否是 firebase.firestore.FieldValue 的实例?它需要同时适用于 node 和 js web。
编辑
一些上下文。现在,如果我尝试编写 class 实例,则会抛出错误
到 Firestore。为了解决这个问题,我创建了一个实用程序 get_database_version
方法来复制
class 实例到可以写入 Firestore 的普通 javascript 对象。
如果该 class 实例中包含某些类型的对象,则 Firestore
视为特殊(如日期和 firebase.firestore.FieldValue's),然后我
只需复制对这些对象的引用。
index.js
class Utils {
static get_database_version(inst, fb) {
if (Utils.is_function(inst)) { Error(); }
/* make sure some firebase is defined. it could be client or admin. */
if (!Utils.is_object(fb) || Utils.is_undefined(fb.firestore)) { Error(); }
/* if its a basic primitive just return it. */
if (!Utils.is_null(inst) && !Utils.is_undefined(inst) && !Utils.is_object(inst)) {
return inst;
}
/* return undefined instead of nulls */
if (Utils.is_null(inst) || Utils.is_undefined(inst)) { return undefined; }
/* preserve Date instances for firestore writes. */
if (inst instanceof Date) { return inst; }
/* preserve fb.firestore.FieldValue instances for firestore writes. */
if (inst instanceof fb.firestore.FieldValue) { return inst; }
/* possible return object */
var obj = {};
/* inst must be an object at this point, so copy it, stripping it of its class. */
for (var key in inst) {
if (!inst.hasOwnProperty(key)) { continue; }
/* recurse on every value on this object */
var res = Utils.get_database_version(inst[key], fb);
/* only add it to the return object if its defined. */
if (Utils.is_defined(res)) { obj[key] = res; }
}
/* i dont want blank objects going to firestore, so make sure it isnt. */
return Utils.key_count(obj) ? obj : undefined;
};
static is_object(value) { return value !== null && (value instanceof Object); };
static is_function(value) { return typeof value === 'function'; };
static is_defined(value) { return typeof value !== 'undefined'; };
static is_undefined(value) { return !Utils.is_defined(value); };
static is_null(some_var) { return some_var === null; };
static key_count(some_object) {
if (!Utils.is_object(some_object)) { throw Error('must pass in an object!'); }
return Object.keys(some_object).length;
};
};
module.exports = Utils;
一个样本input/output:
var obj = {
a: undefined,
b: 55,
c: {
d: {},
e: {
f: 10
}
}
};
console.log(Utils.get_database_version(new Foo(obj), firebase))
//output is an object stripped of Foo
//{
// b: 55,
// c: {
// e: {
// f: 10
// }
// }
//}
我们正在将 FieldValue.delete()
和 FieldValue.serverTimestamp()
的 return 值更改为 FieldValue 的实际实例。这应该是 Firestore Node SDK 下一个版本的一部分。
也就是说,这是一个实现细节,FieldValue.serverTimestamp()
和 FieldValue.delete()
的 return 类型不应影响用户与 Node SDK 的交互方式。我建议您使用自己的类型,而不是依赖我们 SDK 中任何未记录的行为。
说到未记录的行为,一个快速解决方法是直接比较 FieldValue.serverTimestamp()
和 FieldValue.delete()
编辑的对象 return。 userData === FieldValue.serverTimestamp()
之类的检查保证您可以直接将 'userData' 传递给 Firestore。
在 firebase js 网络客户端上:
var fv = firebase.firestore.FieldValue;
var sv = fv.serverTimestamp();
sv instanceof fv //true
而在节点中:
var fb = require('firebase-admin');
var fv = fb.firestore.FieldValue;
var sv = fv.serverTimestamp();
sv instanceof fv //false
我不知道为什么会出现这种不一致。我如何判断一个对象是否是 firebase.firestore.FieldValue 的实例?它需要同时适用于 node 和 js web。
编辑
一些上下文。现在,如果我尝试编写 class 实例,则会抛出错误
到 Firestore。为了解决这个问题,我创建了一个实用程序 get_database_version
方法来复制
class 实例到可以写入 Firestore 的普通 javascript 对象。
如果该 class 实例中包含某些类型的对象,则 Firestore
视为特殊(如日期和 firebase.firestore.FieldValue's),然后我
只需复制对这些对象的引用。
index.js
class Utils {
static get_database_version(inst, fb) {
if (Utils.is_function(inst)) { Error(); }
/* make sure some firebase is defined. it could be client or admin. */
if (!Utils.is_object(fb) || Utils.is_undefined(fb.firestore)) { Error(); }
/* if its a basic primitive just return it. */
if (!Utils.is_null(inst) && !Utils.is_undefined(inst) && !Utils.is_object(inst)) {
return inst;
}
/* return undefined instead of nulls */
if (Utils.is_null(inst) || Utils.is_undefined(inst)) { return undefined; }
/* preserve Date instances for firestore writes. */
if (inst instanceof Date) { return inst; }
/* preserve fb.firestore.FieldValue instances for firestore writes. */
if (inst instanceof fb.firestore.FieldValue) { return inst; }
/* possible return object */
var obj = {};
/* inst must be an object at this point, so copy it, stripping it of its class. */
for (var key in inst) {
if (!inst.hasOwnProperty(key)) { continue; }
/* recurse on every value on this object */
var res = Utils.get_database_version(inst[key], fb);
/* only add it to the return object if its defined. */
if (Utils.is_defined(res)) { obj[key] = res; }
}
/* i dont want blank objects going to firestore, so make sure it isnt. */
return Utils.key_count(obj) ? obj : undefined;
};
static is_object(value) { return value !== null && (value instanceof Object); };
static is_function(value) { return typeof value === 'function'; };
static is_defined(value) { return typeof value !== 'undefined'; };
static is_undefined(value) { return !Utils.is_defined(value); };
static is_null(some_var) { return some_var === null; };
static key_count(some_object) {
if (!Utils.is_object(some_object)) { throw Error('must pass in an object!'); }
return Object.keys(some_object).length;
};
};
module.exports = Utils;
一个样本input/output:
var obj = {
a: undefined,
b: 55,
c: {
d: {},
e: {
f: 10
}
}
};
console.log(Utils.get_database_version(new Foo(obj), firebase))
//output is an object stripped of Foo
//{
// b: 55,
// c: {
// e: {
// f: 10
// }
// }
//}
我们正在将 FieldValue.delete()
和 FieldValue.serverTimestamp()
的 return 值更改为 FieldValue 的实际实例。这应该是 Firestore Node SDK 下一个版本的一部分。
也就是说,这是一个实现细节,FieldValue.serverTimestamp()
和 FieldValue.delete()
的 return 类型不应影响用户与 Node SDK 的交互方式。我建议您使用自己的类型,而不是依赖我们 SDK 中任何未记录的行为。
说到未记录的行为,一个快速解决方法是直接比较 FieldValue.serverTimestamp()
和 FieldValue.delete()
编辑的对象 return。 userData === FieldValue.serverTimestamp()
之类的检查保证您可以直接将 'userData' 传递给 Firestore。