是的,您需要在浏览器中运行的代码和服务器上运行的代码之间进行通信。
基本方法是使用 XHR。客户应该这样做:
(ns foo
(:require [goog.net.XhrIo :as xhr]))
(xhr/send "/api/names"
(fn [e]
(prn (.. e -target getResponseText))))
或者有一个使用非常广泛的库cljs-http
(ns foo
(:require
[cljs.core.async :refer [<!]]
[cljs-http.client :as http])
(:require-macros
[cljs.core.async.macros :refer [go]]))
(go (let [response (<! (http/get "data.edn"))]
(prn (:status response))
(prn (:body response))))
它使用 core.async 通过通道将结果返回给您。但是,您实际上并不需要关心它来使用它,只是要注意go
块中的事情将“稍后”发生。
对于高级用法,您可以使用 sente 创建websockets
网页的一个重要考虑因素是它们只能在为页面提供服务的同一端口上使用同一主机执行 XHR。因此,如果您将 API 托管在 localhost:3030,则必须从 localhost:3030 提供页面,以便您能够与之通信。(这称为同源策略)。
您在问题中声明您的 API 在端口 3000 上,而 Reagent 应用程序从 3030 提供服务。由于相同的来源政策,这将不起作用。有一个称为 CORS 跨域资源共享的标准,从技术上讲您可以使用它,但实际上不要这样做。而是从与 API 相同的服务器提供 HTML/Javascript。
这对您来说意味着您需要确保在构建 Reagent 应用程序时,包含最终 JavaScript 的 HTML 页面需要由为您的 API 提供服务的同一服务器提供服务。通常这是将 HTML 和 JavaScript 放入服务器上的资源文件夹的问题。