如何添加Reagent到Node JS API

我有一个简单的节点JS应用程序提供API。 我可以node main.js来运行服务器,并调用localhost:3000/api/names来成功获取名称列表。 我想用Reagent / Cljsbuild立在这个基础上。

我可以在localhost:3030上运行一个试剂应用程序localhost:3030 。 我的问题是,我如何从试剂应用程序API调用Node应用程序? 还是我的架构都错了? 我应该结合这两个应用程序,如果是的话,如何?

我已经尝试过将它们结合起来,但Reagent想要在Ring上运行,而Node应用程序想要在节点服务器上运行。 所以我还是没有沟通。 我已经试过了快速入门指南,但这不完全相同的情况。 我也给了这个方法无济于事。 将这些组件放在一起以便我可以将Node应用程序的API响应数据带到Reagent应用程序的最简单方法是什么? 或者有没有一种方法可以从我缺less的Reagent应用程序中调用API调用?

是的,您需要在浏览器中运行的代码和服务器上运行的代码之间进行通信。

基本的方法是使用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通过通道将结果返回给您。 你不需要关心它的使用,除非要注意的事情将在“以后”发生。

对于高级用法,您可以创build带有sente的 websockets

网页的一个重要考虑是他们只能在与页面相同的端口上使用相同的主机来执行XHR。 因此,如果您在localhost:3030托pipe您的API,则必须从localhost:3030提供该页面,以便能够与其通信。 (这被称为相同的来源政策)。

您在您的问题中指出,您的端口3000上有您的API,而3030上的是“试剂”应用程序。由于具有相同的原产地策略,这不起作用。 有一个叫做CORS Cross Origin Resource Sharing的标准,在技术上你可以使用,但实际上就是不这样做。 而是从与API相同的服务器提供HTML / Javascript。

这对您意味着什么,只是您需要确保在构build您的Reagent应用程序时,包含最终JavaScript的HTML页面需要由服务于您的API的相同服务器提供服务。 通常这是将HTML和JavaScript放入服务器上的资源文件夹的问题。

Interesting Posts