问题标签 [pedestal]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
clojure - 我应该如何与服务器通信?
想象一下,某个人想要查询比萨饼服务器以获取比萨饼列表。这个人只会做
使用pedestal-app的数据模型和消息,我不确定如何设计客户端-服务器通信。以下是几分钟的吊床带来的可能性:
- 效果
消费者_
- 将消息转换为 HTTP 请求
- 将结果转换回(例如
[{:type :add :topic [:pizzas] :value "cheese"} ...]
) - 将消息放入队列
- 服务器上的专用资源(例如“/edn”)
- 接受基座消息
- 分派到正确的功能
- 响应原始数据(即["cheese"、"extra cheese"、"broccoli"])
- 让效果消费者将结果转换回消息
- 使用路由的专用资源。就像#2,但是
- 更改请求
- 将其转发到路由表中的另一个条目
- 双方留言,同
- 服务器将消息转换为函数调用
- 服务器将结果转换回消息
- 客户端只是将这些消息添加到队列中
在我看来,使用方法 #2 和 #4,我会绕过并失去拦截器的所有好处。使用方法#2,我需要加倍路由逻辑。使用方法#4,我还需要生成大量代码来适应基座客户端。
选项#1 和#3 似乎更好,但#3 闻起来很老套,而#1 方向错误。
你们怎么样?
谢谢!
web-applications - 从 lein repl 中查找命名空间
编辑:已解决我的问题来自两件事——我在某处的 defmacro 中有语法错误。我删除了它并编写了一个我可以访问的小函数(仅在重新启动 repl 后)。第二个大问题是我不知道需要重新启动 repl 以识别我所做的任何更改。如果没有下面给出的具体答案,永远不会明白这一点=)。
我一直在研究 github 上的基座教程,它建议通过 repl 测试一些东西 - 我的问题是我找不到我感兴趣的命名空间/宏或函数。
我在语法上尝试了其他东西,例如(需要'junkyard-client.html-templates)。这是基座教程中的 v2.0.10:https ://github.com/pedestal/app-tutorial/wiki/Slicing-Templates
编辑:这就是我想要达到的
解决阶段
clojure - 如何在 clojurescript 文件基座上编写测试?
我在学习基座时尝试使用 TDD,但我被困在如何在 .cljs 文件上编写和执行测试(lein 测试)。我不知道测试属于哪里,是否可以用简单的 clojure 编写主题,或者我是否必须用 clojureScript 编写它们并在浏览器中运行它们。
clojure - Enlive 模板自动重新加载/检测 Pedestal 服务中的更改
我正在使用 autoreload-server 示例,该示例非常适合使用 ns-tracker 在更改 .clj 文件时重新加载命名空间。
https://github.com/pedestal/samples/blob/master/auto-reload-server/dev/dev.clj
但是,它不会在 resources/public 目录中获取激活模板的更改。我已将模板路径添加到 defn watch 中的向量:
以及使用 enlive deftemplate 的命名空间中的这个:
(net.cgrand.reload/auto-reload *ns*)
但是,这不起作用。我的假设是 ns-tracker 仅适用于 clj 文件,并且我错误地使用了 enlive reload 功能。
有没有人在使用 enlive 并且已经解决了这个问题,或者有什么想法可以尝试?
clojure - 用于响应式应用程序的 Clojure Web 框架
我最近继承了一个用 Clojure 编写的未完成的 Web 应用程序,基本上基于 compojure 和 hiccup。用 OO 风格而不是 FP 风格来建模某种 MVC 是一个糟糕的尝试,如此处所示。所以我打赌几乎从头开始重新启动项目,重用有用的部分。我考虑以下替代方案:
破坏性最小的选择是 Compojure+Enlive+jquery-pjax
使用像Pedestal这样的 clojure web 框架有这方面的经验吗?
最初的想法是实现一个服务于 JSON 的 RESTful API,因此对于更详细的解决方案,我将 Backbone+react.js 用于前端,将Liberator 用于后端,但它可能需要比传统的开发时间更长的时间服务器应用程序。
考虑到需要 Ajax 经验的想法和替代方案,非常感谢!
clojure - 用 clojure 编写的桌面应用程序
可以推荐 clojure 生态系统中的哪些技术来开发独立的桌面应用程序?我正在寻找的技术应该支持
- 访问本地文件系统(例如文件对话框)。
- 通过 http/https 访问网络
- 支持更新桌面应用程序
- 异步支持(运行多个线程)
- 跨平台(虽然不需要智能手机)
- 对本机库的互操作支持(不是 100% 需要,但如果它不支持它是有风险的)
- 合理的生态系统。例如,我需要将 xml 文件验证为 xsd,最终我需要进行一些线性代数计算。
我想到了以下替代方案:
clojure/跷跷板:
- -- 需要 java 运行时
- -- 标准的挥杆外观/感觉可能是一个缺点
- ++ 健壮的java平台
- ++ 庞大的生态系统
- ++ 互操作支持不是问题
- ++ core.async
clojurescript/html5/css:
- ++ 可以与 node-webkit 或 appjs 一起使用来交付独立的桌面应用程序。
- ++ 通过 css 灵活的外观/感觉
- ++ 强大的平台
- ——更小的生态系统。例如,如何处理 xml 文件或支持数学库?
- -- 互操作支持可能是个问题。我可以从 node-webkit 调用例如本机库吗?
- -- 单线程环境,异步支持呢?
- -- 不清楚如何更新应用程序。
座
- ++ 简化了应用程序架构的开发
- -- 不确定它是否可以部署为 node-webkit 应用程序或 appjs。
clojure - Pedestal:你可以使用什么数据流来渲染一个新初始化的空列表?
我正在尝试制作一个非常基本的基座应用程序来显示项目列表,或者如果列表为空,则显示短信。
我以为我想要的是:
- 一个数据模型,其中 [:root :items] 将是我的项目列表
- 页面的模板函数 ([:root])
- 空列表的静态模板函数
- 带有元素的列表的动态模板函数
- 在应用程序开始时,发送一条消息,将列表初始化为空
- 在渲染中,响应:
[node-create [] :map]
通过做...什么都不做?[node-create [:root] :map]
通过呈现整个页面的模板[node-create [:root :items] :map]
通过为空列表添加模板
需要明确的是,我最后想要显示的是(没有元素)
当列表中有内容时:
我在正确的轨道上吗?
我坚持将数据模型初始化为我想要的。我得到的最接近的是:
问题是,通过这种方式,我得到了一个包含值 {:items [] } 的单个 :root 节点的数据模型。
这听起来像是一个非常愚蠢的问题,但这两个数据模型是否相同?
当我启动我的应用程序时,生成的渲染增量是:
我认为这不适合渲染我的项目列表,是吗?
更新 :
@solussd 暗示这两个数据模型是相同的;但是,当生成以下增量时:
我还是应付不来。如果我添加这样的渲染配置:
然后不调用该render-items-list
函数。
如果我添加这样的渲染配置:
然后render-root
将调用该函数,但显然不是使用正确的“路径”,我想当数据模型中的“:根”元素的任何其他更改发生更改时,它也会被调用。
欢迎任何想法我如何解决这个问题......
clojure - 如何从继续发出启用转换的消息
我已经进入 clojure/pedestal 项目大约 2 个月了,现在我正在学习 continue 并尝试使用一个来启用或禁用按钮上的点击事件。这个想法是我的报告有一个上一个和下一个按钮,我想根据一些数据启用或禁用这些按钮。我在我的应用程序模型中的继续看起来像这样......
然后我的继续功能看起来像这样。(原谅草率的代码和总是被证明是真的条件 - 我的 clojure 很弱,我一直在破解这个函数试图让它工作。
问题是,这些消息永远不会到达渲染器。我尝试将消息/类型更改为不同的内容,然后将该类型/主题放入我的转换中,并且这些消息确实通过了。我的猜测是我需要以某种方式将此消息直接放在发射队列上(如果有这样的事情),但我不知道该怎么做。我试过查看 msg 元数据,并看到人们使用 ^:input 将消息直接放在输入队列上,但我找不到关于所有这些如何工作的好的文档。
有任何想法吗?
clojure - Clojure Light Table 客户端-服务器方法之谜
如何设置它,以便我可以在 Mac 上使用 Light Table,连接到 Ubuntu 托管的 nREPL,并创建一个新的 program/project.clj?任何人都可以帮助我了解我的方法应该是什么,以及我哪里出错了?
我有一个在 VirtualBox 中的 Ubuntu 服务器,还有 Leiningen、Pedestal 和一个在浏览器中显示的基座“helloworld”示例程序。我只是无法连接到运行 helloworld 程序的同一个 REPL。我没有对服务器端对象的客户端访问或控制。
我想从我的 Mac 主机 LT 进行客户端-服务器 Clojure 开发,创建可以在 REPL 中查看的服务器端程序。
我发现 LT 在这方面并不直观,而且我读过的建议仅表明 LT 将连接到现有项目/REPL。我想从客户端创建新对象
session - 在 Pedestal 中设置和使用基于 cookie 的会话
我很欣赏一个基本的基座示例,说明如何(1)设置在服务器重新启动后仍然存在的 cookie 和(2)使用基于 cookie 的会话;特别是如何获取和设置值。
我有点惊讶没有找到使用的示例ring.middleware.session/wrap-session
(此处的源代码:https ://github.com/ring-clojure/ring/blob/master/ring-core/src/ring/middleware/session.clj ) .
设置
根据这个使用 Ring 中间件的 Pedestal 示例代码,有两个关键的东西要添加到您的service.clj
. 首先,定义会话拦截器:
但是,示例代码有这个警告:
在此示例代码中,我们没有指定在将会话数据发送回浏览器之前加密会话数据的秘密。这有两个后果,第一个是我们需要在整个服务中使用相同的拦截器实例,以便会话数据对所有路径都是可读写的。第二个后果是当服务器进程结束时会话数据将变得不可恢复。即使浏览器保留了 cookie,它也不是不可恢复的密文,会话拦截器会将其视为不存在。
如何克服上述限制?
其次,添加session-interceptor
到您的路线(以下是我的示例代码):
使用(获取和设置)
我知道上面的设置步骤会导致 Ring 中间件向:session
请求映射添加一个键。所以得到很容易:(:session request)
. 但是我如何以及在哪里添加到会话中?一个例子将不胜感激。