Javascript - 使用 fetch 查询 VoltDB api

Javascript - Querying VoltDB api with fetch

我正在尝试使用 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(queryURL, { mode: 'no-cors').then( response => {
        response.text().then( text => console.log(text) )
    })

它什么都不做

您应该对所有 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]]}]}

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

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

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

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

我认为这使用 low-level javascript 打开套接字进行 HTTP 调用而不使用 XMLHttpRequest,因此它避免了 No Access-Control-Allow-Origin 错误。

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