2016-01-10 55 views
1

我正在编写需要读取和写入Firebase服务器后端的程序。我不知道为什么,但JS解释器说我缺少冒号并且我的定义已关闭。这是确切的错误:属性ID后缺少冒号,Firebase

SyntaxError: missing : after property id firebase.js:14:31 
ReferenceError: refs is not defined visview.js:18:1 
ReferenceError: addUser is not defined 

但是,我已经明确定义这些东西,我的功能格式正确。也许我错过了一些东西。

HTML:

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width"> 
    <title>Web of Hunger</title> 
    </head> 
    <body> 
    <div id="visGraph" class="visNetwork"> 
     <canvas height="100%" width="100%" style="position: relative; -moz-user-select: none; width: 100%; height: 100%;"></canvas> 
    </div> 

    <link href="https://cdnjs.cloudflare.com/ajax/libs/vis/4.12.0/vis.min.css" rel="stylesheet" type="text/css" /> 
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/vis/4.12.0/vis.min.js"></script> 
    <script type="text/javascript" src="https://cdn.firebase.com/js/client/2.3.2/firebase.js"></script> 
    <script type="text/javascript" src="./js/firebase.js"></script> 
    <script type="text/javascript" src="./js/visview.js"></script> 
    <script type="text/javascript" src="./js/app.js"></script> 
    </body> 
</html> 

firebase.js:

var refs = { 
     root : new Firebase("Sorry, I am not allowed to show the URL"), 
     users : new Firebase("Sorry, I am not allowed to show the URL"), 
     graph : { 
     graph : new Firebase("Sorry, I am not allowed to show the URL"), 
     nodes : new Firebase("Sorry, I am not allowed to show the URL"), 
     edges : new Firebase("Sorry, I am not allowed to show the URL") 
     } 
    }; 

    //data manipulation functions (low level to high) 

    var addNode = function(node){ 
     refs.graph.nodes.update({node.name : "temp"}); 
     refs.graph.nodes.child(node.name).set({ 
     "id" : node.id, 
     "label" : node.label 
     }); 
    }; 

    var addEdge = function(edge) { 
     refs.graph.edges.update({edge.name : "temp"}); 
     refs.graph.edges.child(edge.name).set({ 
     "from" : edge.from, 
     "to" : edge.to, 
     "arrows" : edge.arrows 
     }); 
    }; 

    var addUser = function(name, edges) 
    { 
     if(refs.users.child(name) === null) 
     { 
     var time = Firebase.ServerValue.TIMESTAMP; 

     if(refs.graph.nodes.child(name) === null && refs.graph.edges.child(name) === null) 
     { 
      refs.users.update({name : {}}); 
      refs.users.child(name).update({ 
      "id" : time, 
      "edges" : {} 
      }); 
      refs.users.child(name).child("edges").update({ 
      "to" : {}, 
      "from" : {} 
      }); 

      addNode(new Node(name, time, name)); 

      for(var i = 0; i < edges.length; i++) 
      { 
      var nme = edges[i].name; 
      refs.users.child(name).child("edges/to").update({nme : true}); 
      addEdge(new Edge(name, time, edges[i].to, edges[i].arrows)); 
      //TODO add a "from" edge so that you know who wants to eat you 
      } 
     } 
     } else { 
     alert("Username, node name, or edge name taken."); 
     } 
    }; 

visview.js:

//handy data structures 

var Node = function(name, id, label) { 
    this.name = name; 
    this.id = id; 
    this.label = label; 
}; 

var Edge = function(name, frm, to, arrows) { 
    this.name = name; 
    this.from = frm; 
    this.to = to; 
    this.arrows = arrows; 
}; 

//functions that allow vis to read firebase data 

refs.graph.graph.on("value", function(snapshot) { 
    console.log(snapshot.val()); 

    //main vis update section 
    getGraphDataAsVis(snapshot.val()); 

}); 

var getGraphDataAsVis = function(data) { 
    //var nodes = refs.graph.child("nodes"). 
}; 

app.js:

addUser("tester1", [new Edge("test1", 0, 1, 'to')]); 
addNode(new Node("tester2", 400, "tester2")); 
+0

语法错误几乎肯定会导致其他错误。因为“firebase.js”中的代码无法解析,所以根本不会执行它。 – Pointy

回答

0

这是语法错误:

refs.graph.nodes.update({node.name : "temp"}); 

在现代(ES2015)的JavaScript,这将是

refs.graph.nodes.update({ [node.name] : "temp"}); 

在老版本的JavaScript的,有做的不紧凑的方式。你可以写一个辅助函数:

function obj() { 
    var rv = {}; 
    for (var i = 0; i < arguments.length; ++i) 
     rv[arguments[i]] = rv[arguments[i+1]]; 
    return rv; 
    } 

然后:

refs.graph.nodes.update(obj(node.name, "temp")); 

的辅助函数“目标文件”只是把它作为参数值的名称 - 值对的序列。第一个参数是第一个属性名称,第二个参数是第一个属性值,依此类推。在ES2015之前,该语言不支持在对象初始值设定程序中评估:左侧一侧的表达式以确定属性名称的概念。只有属性值可以是作为对象初始值设定项解释的一部分进行评估的表达式;属性名称必须是常量。

+0

这是我一年前第一次使用老JS。我最近爱上了Babel,一个JS编译器,它将ES6转换为ES5及更低版本。 – jonathanhuo11

+0

那么确定,如果你使用Babel,那么这将有诀窍。然而,即使ES2015会因为你遗漏'[]'而给你语法错误。 – Pointy