0

我正在尝试使用其 api 查询 VoltDB:

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

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

使用该代码会引发“No Access-Control-Allow-Origin”错误。如果我将 fetch 调用更改为此:

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

它什么也不做

4

2 回答 2

1

这是一个浏览器安全功能。如果您从一个 url 提供网页,并且在页面中嵌入了对另一个主机或端口的 url 调用,那么浏览器将不允许这样做。

解决此问题的一种方法是将代理添加到您的 Web 服务器,以便它可以调用端口 8080,并将响应从同一来源传回网页。

您可能会在 Stack Overflow 上看到一些关于使用 CORS 来解决此错误的答案,但这需要更改 VoltDB 在端口 8080 上使用的标头,因此您不能自己做这件事,我们也没有计划这样做。

另一种解决方案是使用我们的一些演示中提供的 voltdb.js 文件,例如 NBBO 演示仪表板:https ://github.com/VoltDB/voltdb/tree/master/examples/nbbo/web

我认为这使用低级 javascript 打开套接字以在不使用 XMLHttpRequest 的情况下进行 HTTP 调用,因此它避免了 No Access-Control-Allow-Origin 错误。

在示例中,特定于 NBBO 示例的代码在 demo.js 中,voltdb-dashboard.js 包含各种示例仪表板通用的代码,而 voltdb.js 是提供异步调用程序访问的基础库。

于 2016-11-01T16:01:01.857 回答
0

您应该对所有 URI 参数进行编码,而不仅仅是对过程参数进行编码

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

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

或者

$ 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,"results":[{"status":-128,"schema":[{"name":" C1","type":6}],"data":[[100000]]}]}

于 2016-10-31T20:00:44.270 回答