问题标签 [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.

0 投票
1 回答
210 浏览

clojure - 我应该如何与服务器通信?

想象一下,某个人想要查询比萨饼服务器以获取比萨饼列表。这个人只会做

使用pedestal-app的数据模型和消息,我不确定如何设计客户端-服务器通信。以下是几分钟的吊床带来的可能性:

  1. 效果 消费者_
    • 将消息转换为 HTTP 请求
    • 将结果转换回(例如[{:type :add :topic [:pizzas] :value "cheese"} ...]
    • 将消息放入队列
  2. 服务器上的专用资源例如“/edn”)
    • 接受基座消息
    • 分派到正确的功能
    • 响应原始数据(["cheese"、"extra cheese"、"broccoli"])
    • 让效果消费者将结果转换回消息
  3. 使用路由的专用资源。就像#2,但是
    • 更改请求
    • 将其转发到路由表中的另一个条目
  4. 双方留言,同
    • 服务器将消息转换为函数调用
    • 服务器将结果转换回消息
    • 客户端只是将这些消息添加到队列中

在我看来,使用方法 #2 和 #4,我会绕过并失去拦截器的所有好处。使用方法#2,我需要加倍路由逻辑。使用方法#4,我还需要生成大量代码来适应基座客户端。

选项#1 和#3 似乎更好,但#3 闻起来很老套,而#1 方向错误。

你们怎么样?

谢谢!

0 投票
1 回答
511 浏览

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

编辑:这就是我想要达到的

问题阶段 https://github.com/Sammons/clojure-projects/tree/d9e0b4f6063006359bf34a419deb31a879c7a211/pedestal-app-tutorial/junkyard-client

解决阶段

0 投票
1 回答
219 浏览

clojure - 如何在 clojurescript 文件基座上编写测试?

我在学习基座时尝试使用 TDD,但我被困在如何在 .cljs 文件上编写和执行测试(lein 测试)。我不知道测试属于哪里,是否可以用简单的 clojure 编写主题,或者我是否必须用 clojureScript 编写它们并在浏览器中运行它们。

0 投票
2 回答
750 浏览

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 并且已经解决了这个问题,或者有什么想法可以尝试?

0 投票
1 回答
4226 浏览

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 经验的想法和替代方案,非常感谢!

0 投票
2 回答
1336 浏览

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。
0 投票
2 回答
293 浏览

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将调用该函数,但显然不是使用正确的“路径”,我想当数据模型中的“:根”元素的任何其他更改发生更改时,它也会被调用。

欢迎任何想法我如何解决这个问题......

0 投票
1 回答
54 浏览

clojure - 如何从继续发出启用转换的消息

我已经进入 clojure/pedestal 项目大约 2 个月了,现在我正在学习 continue 并尝试使用一个来启用或禁用按钮上的点击事件。这个想法是我的报告有一个上一个和下一个按钮,我想根据一些数据启用或禁用这些按钮。我在我的应用程序模型中的继续看起来像这样......

然后我的继续功能看起来像这样。(原谅草率的代码和总是被证明是真的条件 - 我的 clojure 很弱,我一直在破解这个函数试图让它工作。

问题是,这些消息永远不会到达渲染器。我尝试将消息/类型更改为不同的内容,然后将该类型/主题放入我的转换中,并且这些消息确实通过了。我的猜测是我需要以某种方式将此消息直接放在发射队列上(如果有这样的事情),但我不知道该怎么做。我试过查看 msg 元数据,并看到人们使用 ^:input 将消息直接放在输入队列上,但我找不到关于所有这些如何工作的好的文档。

有任何想法吗?

0 投票
1 回答
422 浏览

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。我想从客户端创建新对象

0 投票
1 回答
1462 浏览

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). 但是我如何以及在哪里添加到会话中?一个例子将不胜感激。