【问题标题】:firestore error:"Nested arrays are not supported". Firestore/p5.js problemfirestore 错误:“不支持嵌套数组”。 Firestore/p5.js 问题
【发布时间】:2020-02-29 18:01:09
【问题描述】:

有人可以帮助我更好地理解这个错误吗?我正在尝试使用 p5.js 和 firebase/firestore 创建一个站点,您可以在该站点上在画布上绘制一些东西,然后将绘图保存到 firestore,但是当我单击保存时,我收到此错误:

error.ts:166 未捕获的 FirebaseError:使用无效数据调用函数 DocumentReference.set()。不支持嵌套数组

到目前为止我的代码:

var drawing = [];
var currentPath = [];
var isDrawing = false;

function setup() {
    canvas = createCanvas(400,400);
    canvas.mousePressed(startPath);
    canvas.parent('canvas');
    canvas.mouseReleased(endPath);
    var saveButton = select('#saveButton');
    saveButton.mousePressed(saveDrawing);
}

function startPath() {
    isDrawing = true;
    currentPath = [];
    drawing.push(currentPath);
}

function endPath() {
    isDrawing = false;
}

function draw() {
    background(0);

    if (isDrawing){
        var point = {
        x: mouseX,
        y: mouseY
        }
    currentPath.push(point);
    }

    stroke(255);
    strokeWeight(7);
    noFill();
    for (var i = 0; i < drawing.length; i++) {
        var path = drawing[i];
        beginShape();
        for (var k = 0; k < path.length; k++) {
            vertex(path[k].x, path[k].y)
        }
        endShape();
    }
}

function saveDrawing(){
    db.collection('joonistused').add({
        drawing: drawing
    });
    var result = ref.push(data, dataSent);
    console.log(result.key)

    function dataSent(status) {
        console.log(status);
    }
}

编辑:如何将数组中的绘图坐标存储到 Firestore?喜欢将我的绘图保存到 Firestore 中吗?

【问题讨论】:

  • 很抱歉问了一些显而易见的问题,但是您是否意识到 drawing 有一组数组作为项目,并且错误指出 Firebase 不允许包含数组的数组?您对错误有什么不明白的地方?
  • 嗯好吧,但我怎样才能将绘图坐标存储在数组中以任何其他方式存储?抱歉,这个有点新……
  • 您可以将对象存储在数组中,并将数组存储在该对象中。请参阅我的回答,我引用了一个类似的问题,更好地解释了这种限制;)

标签: javascript node.js firebase google-cloud-firestore p5.js


【解决方案1】:

事实上,drawing 是一个数组,其中直接项也是数组。由于某些技术限制,Firebase 似乎不允许拥有数组数组。

similar question on StackOverflow 的答案表明您仍然可以间接拥有数组数组,如Troy Michael 所述:

您可以调整一个将具有对象类型的数组转换为映射的序列化函数。键可以是数字以保持顺序。

即{ 1:对象,2:对象2 ... }

在反序列化时,您可以获得 Object.values(data);将其放回数组中以供客户端使用。

您可以这样做,或者简单地将子数组嵌套到对象中,其中drawing 类似于[ { items: [ ... items of array ...] }, ... ]。现在注意drawing 是一个对象数组,其中每个对象都有一个名为items 的字段,它是一个项目数组。根据引用的问题,似乎足以解决该限制。

【讨论】:

  • 好吧,我有点理解.. 但这对我来说有点困惑,这对我来说真的很新,但我正在努力学习更多.. 所以我可以创建一个数组来存储我的路径,比如 path1当我按下鼠标并释放 = path1 时,里面有 mouseX 和 mouseY?所以我的问题出在函数 draw() 中?
  • 我觉得“画图”功能还可以。您的问题出在“startPath”上。看,“currentPath”是一个数组。您正在将该数组推向“绘图”。现在“绘图”是一个包含数组的数组。而不是做currentPath = [] 你可以做currentPath = { items:[] } (更新它设置的两个地方)。在那之后,你必须去“画”功能,而不是做currentPath.push(你必须做currentPath.items.push(
  • 我想我改变和编辑了一些东西,我可以绘制和查看我的数组,但我仍然有问题,我一直在集思广益这么久,我的头可能会爆炸.. screenshot of问题:puu.sh/EAFcP/ae3efd8a49.png
  • 好的,我修好了,我想,我看不到我在画什么,但我可以在控制台中检查我的画,它在 firestore 中也显示相同的坐标!!那已经很大了。惊人的! SS:puu.sh/EAFii/27ebf7001c.png
  • 不错^^!如果我的回答对你有帮助,请采纳作为问题的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多