2016-10-31 1 views
0

Ich versuche, einen VoltDB mit seinem api abfragen:Javascript - Querying VoltDB api mit holen

const url = 'http://server:8080/api/1.0/' 
    const queryParam = encodeURIComponent('select * from table') 
    const queryURL = url + `[email protected]&Parameters=['${queryParam}']&jsonp=console.log` 

    fetch(queryURL).then(response => { 
     response.text().then(text => console.log(text)) 
    }) 

Mit diesem Code löst einen "No Access-Control-Allow-Origin" Fehler. Wenn ich ändern die auf diesen Aufruf Abrufs:

fetch(queryURL, { mode: 'no-cors').then(response => { 
     response.text().then(text => console.log(text)) 
    }) 

Es tut nichts

Antwort

1

Dies ist eine Browser-Sicherheitsfunktion. Wenn Sie eine Webseite von einer URL aus bedienen und innerhalb der Seite, auf der Sie URL-Aufrufe an einen anderen Host oder Port eingebettet haben, lässt der Browser dies nicht zu.

Eine Möglichkeit, dies zu umgehen, besteht darin, Ihrem Webserver einen Proxy hinzuzufügen, damit er die Anrufe an Port 8080 tätigen und die Antworten vom selben Ursprung an die Webseite zurückgeben kann. Sie sehen möglicherweise einige Antworten auf Stack Overflow über die Verwendung von CORS, um diesen Fehler zu umgehen, aber dafür müssen die Header geändert werden, die VoltDB an Port 8080 verwendet. Das können Sie also nicht selbst tun, und wir haben keine Pläne Das.

Eine andere Lösung ist es, die voltdb.js Datei in einigen unserer Demos, wie die NBBO Demo Armaturenbrett zu nutzen: https://github.com/VoltDB/voltdb/tree/master/examples/nbbo/web

Ich denke, das verwendet Low-Level Javascript einen Socket zu öffnen, um den HTTP-Anruf ohne XMLHttpRequest zu verwenden, damit der Fehler "Kein Zugriffssteuerungs-Zulässiger Ursprung" vermieden wird.

Im Beispiel ist der Code, der für das NBBO-Beispiel spezifisch ist, in demo.js, voltdb-dashboard.js enthält Code, der verschiedenen Beispiel-Dashboards gemeinsam ist, und voltdb.js ist die Basisbibliothek, die Zugriff darauf bietet Prozeduren asynchron aufrufen.

0

Sie sollten alle URI-Parameter kodieren nicht nur die Prozedur Parameter

$ curl --data '[email protected]&Parameters=["select count(*) from store;"]' http://127.0.0.1:8080/api/1.0/ 

{ "status": 1, "appstatus": - 128, "statusstring": null, "appstatusstring": null, "ergebnisse": [{"status": - 128, "schema": [{"name": "C1", "type": 6}], "Daten": [[100000]]}]}

oder

$ curl --data 'Procedure=%40AdHoc&Parameters=%5B%22select+count(*)+from+store%3B%22%5D' http://127.0.0.1:8080/api/1.0/; echo 

{ "status": 1, "appstatus": - 128, "Statusstring": null, "appstatusstring": null, "Ergebnisse": [{ "status": - 128, "Schema": [{"Name": "C1", "Typ": 6}], "Daten": [[100000]]}]}

+0

Wenn ich curl verwende, habe ich keine Probleme, weil das eigentliche Problem die Cross-Domain-Anfrage ist. Außerdem muss ich nicht alle Abfrageparameter kodieren, weil ich dies vom VMC ausprobiert habe und es hat gut geklappt. – aamadeo