如何通过Javascript单独访问我的GrapheneDB neo4j数据库

时间:2014-07-08 12:24:35

标签: javascript php neo4j

我在GrapheneDB中有一个Neo4j数据库,我希望我和我的朋友能够通过Javascript从HTML页面创建节点和关系。我正在将HTML页面托管到我的服务器空间。

这是我尝试测试节点创建的。

<!doctype html>
<html>
<head>
    <title></title>
</head>
<body>
</body>
</html>

script type="text/javascript">
    var r = new XMLHttpRequest();
    r.open("POST", "GRAPHENE REST URL", true);
    r.onreadystatechange = function () {
        if (r.readyState != 4 || r.status != 200) return;
        var json_response = JSON.parse(r.responseText);
        console.log(json_response);
    };
    var cyQuery=JSON.stringify({"query" : "CREATE (ee:Person { name: 'Emil', klout: 99 })"});
    r.send(cyQuery);
</script>

如您所见,我尝试将REST API与Cypher一起使用,但会产生以下错误:

  

&#34;无法加载资源:服务器响应状态为401(未授权)&#34;

据我所知,这是因为我没有登录Graphene。 我的问题有两个:

  1. 我可以在后台实现对Graphene的登录(可能是通过PHP),这样访问HTML页面的所有用户都可以创建一个节点吗?
  2. 我可以在不安装Neo4j REST驱动程序的情况下完成吗?我无法在我的服务器空间安装程序,我只能上传文件。
  3. 谢谢,我希望我的问题有道理。

2 个答案:

答案 0 :(得分:1)

  1. 您的代码中似乎没有包含身份验证凭据。 GrapheneDB需要HTTP基本身份验证。

  2. 您应该可以在JS中执行此操作。但是,这不是推荐,因为任何人都可以获取您的凭据,访问您的数据库,修改和删除数据等。

  3. 如果您希望用户能够查询和修改数据库,我建议:

    • 使用代理或webapp连接到实例,从而隐藏用户的身份验证凭据
    • 在您的应用中实施某种用户身份验证,以便只有登录您应用的用户才能查询/修改您的数据库。

答案 1 :(得分:0)

我在这里很快就做了一件事。 当我躺下时,我在外部计算了用户名:password的base64(使用openssl enc base64)并将其作为环境变量提供,正确的做法是提供两者并在节点中进行编码。

cat package.json 


{
  "name": "proxy-neo4j-db",
  "version": "0.0.1",
  "private": true,
  "engines": {
    "node":"0.8.26",
    "npm":"1.1.49"
  },
  "scripts": {
    "start": "node proxy"
  },
  "dependencies": {
    "connect": "2.19.5",
    "http-proxy" :"1.1.4"
  }
}

cat proxy.js 


var httpProxy = require('http-proxy');
var connect = require('connect');

var target = { target: process.env.NEO4J_URL || process.env.GRAPHENEDB_URL || "http://localhost:7474" };
var port = process.env.PORT || 8001;
var auth = "Basic "+process.env.AUTH;

connect.createServer(
  function (req, res) {
    req.headers['Authorization']=auth;
    proxy.web(req, res);
  }
).listen(port);

var proxy = httpProxy.createProxyServer(target);