问题标签 [servant]

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 回答
296 浏览

haskell - 加入两个 Network.Wai.Application

我分别使用servantNetwork.Wai.Application.Static用于 json api 和静态文件服务。我想加入这两个应用程序,如果staticApp服务失败,请求应该去jsonApp

我试着找出并阅读websocketsOr它是如何做到的。Websockets或

我终于写道:

但似乎其他人(wai 本身)会这样做,处理许多可能的情况。但我找不到。

我缺少哪些边缘情况(例外??)以及我可以使用哪些其他 api 来做同样的事情?

0 投票
2 回答
575 浏览

haskell - 包罗万象或默认路由

index.html如今,如果请求的路由与现有 API 端点或其他静态资产不匹配,则需要从后端返回文件(例如 )的情况并不少见。这在使用react-routerand时特别方便browserHistory

我对如何与仆人一起处理这件事有点难过。我确实想知道拦截 404 是否是可行的方法,但是当然有时 API 需要合法地发出 404。这是我一直用来试验的那种东西:

如果请求与 API 端点或静态目录中的任何内容不匹配,我很想看到一个示例,说明如何添加发送 HTML 响应的“默认路由”。玩具回购在这里

0 投票
1 回答
117 浏览

haskell - 在类型系统中为串行格式建模,例如 Servant

我正在开发一个忽略 XML 或 JSON 的存在而只支持附加字符数据的 API 集成。(Metro2格式,如果有兴趣)

我正在简化,但想象一个人需要像这样被序列化:

  • 在 pos 0, 4 chars:消息中的字节数
  • 在 pos 5:6 个字符:"PERSON"硬编码
  • 在 pos 11: 20 字符:名称,左对齐和空格填充
  • 在 pos 21:8 个字符:生日,YYYYMMDD
  • 在 pos 29:3 个字符:年龄,右对齐和零填充

数字字段始终右对齐并补零。文本字段始终左对齐并填充空格。

例如:

我可以在类型系统中表达这个吗?就像仆人做的那样?像这样的东西?

我可以静态检查我的序列化实现是否与类型匹配?

我可以静态检查第三个字段(Name)的偏移量是否为11?前面字段的长度加起来是 11?我假设没有,因为这似乎需要完全依赖类型的支持。

这是在正确的轨道上吗?

更新:我想静态验证的函数示例:

0 投票
1 回答
164 浏览

haskell - 如何解决 SqlBackend 和 PersistEntityBackend 之间的类型不匹配?

使用servantpersistent库创建 REST API,我在使用insertUnique创建新实体时遇到类型不匹配错误。

这是有问题的功能:

出现以下错误:

供参考,runDb功能:

和新App类型:

我尝试过类型提示insertUniqueas的结果SqlBackend,但这会导致同样令人困惑的错误。SqlBackendPersistentEntityBackend类型不能互换吗?

或者单子格式不正确?

非常感谢任何帮助。

0 投票
1 回答
434 浏览

haskell - Haskell仆人wai中间件无法正常工作

所以,我想向我的服务服务器添加两个 wai 中间件。一种用于提供静态文件的中间件,一种用于日志记录的中间件。

我定义了我的 api ( router),这就是我启动服务器的方式:

这就是我如何定义我的middleware

现在,如果我把它logStdoutDev放在第一位,我就不能提供静态文件,但是如果我把它staticPolicy放在第一位,我就可以提供静态文件,但是我失去了记录事件的能力(基本上它们被忽略了)。

问题真的是,如何wai在servant中正确组合中间件。

0 投票
1 回答
1086 浏览

haskell - Haskell Servant 客户端教程

我是 Haskell 和 Servant 的新手,正在尝试启动并运行官方教程。我一直在努力让本教程工作以查看它,但一整天都无法让它工作。我讨厌在这里发布这样的问题,但老实说我不知道​​为什么代码不能正常工作我没有对其进行任何更改。我想知道是否有其他人尝试实施本教程并遇到类似的问题。

我已经看到一些关于不再使用当前仆人版本的教程的帖子,但本教程似乎是仆人客户端的最新教程。

这是教程http://haskell-servant.readthedocs.io/en/stable/tutorial/Client.html

这是代码

这是我得到的错误

0 投票
2 回答
216 浏览

haskell - ZonedTime fromJSON toJSON

我对. Aeson_ServantZonedTime

对于我的Servant应用程序,我在 url: 中给出了一些时间.../2016-12-18T07:51:00+03:00/...

Servant轻松将其转换为ZonedTimewith ... :> Capture "zt" ZonedTime :> ...

然后我的应用程序会进行一些计算,并且在 json-response 中我想将这个和其他一些ZonedTimes 回馈给客户——以防客户想再次将这些时间给我的应用程序。

如果输入时区不为零+0X:00(X / = 0),那么在输出上我也会得到+0X:00,但如果在输入上我给出.../2016-12-18T07:51:00+00:00/...,那么作为响应我得到2016-12-18T07:51:00Z。如果我尝试Servant再次将此字符串提供给.../2016-12-18T07:51:00Z/...,则Servant无法将其转换为ZonedTime. 其实是退货HTTP 400 (Bad Request)

为什么?做什么的?

0 投票
1 回答
520 浏览

database - Haskell Servant 将自定义数据传递给身份验证处理程序

我正在使用自定义 monad(带有阅读器)轻松地将数据库池之类的数据传递给我的处理程序(在使用自定义 monad 之前,我曾经将连接作为 fn 参数传递)。

这就是我定义我的自定义 monad 的方式:

ServerEnvironment只是我用来携带数据的自定义数据类型。

问题是AuthHandler我必须专门使用以下功能:

作为身份验证处理程序,我不能使用我的自定义处理程序:

而且我也无法通过,ConnectionPool因为签名不能是:

那么,如何在不使用全局IO状态的情况下将额外数据传递给servant 中的身份验证处理程序?

0 投票
3 回答
1230 浏览

haskell - Haskell Servant 从处理程序获取当前路由/URL

我想获得与我的处理程序相对应的当前路线。这是我的服务器的模型,仅供参考:

这里有一些处理程序:

我的服务器:

所以,基本上我route1and2Handler应该有某种方式来获取当前路线。HasServer我已经尝试将请求对象放入我的处理程序并通过实现这样的实例从中提取 url :


[编辑]我刚刚注意到我正在查看旧版本仆人的 api,这不再有效。Newroute有类型签名,route :: Proxy api -> Context context -> Delayed env (Server api) -> Router env我真的看不出Request从这里得到的方法。


而不是使route1and2Handler类型签名成为Request -> Handler Text,但我在尝试创建HasServer实例时遇到了这个错误:

最后要指出的是,我的最终目标是从 中获取当前路线,Handler在数据库中为路线添加访问计数仅用于示例目的。我对计算访问次数或类似情况的更好方法不感兴趣。

0 投票
2 回答
165 浏览

haskell - 将基于 ReaderT 的客户端包装器与 Servant 客户端一起使用

我正在尝试使用我将用来调用 REST 资源的ClientM附加参数来扩展仆人的 monad 。Token

然后我为仆人模式匹配定义了以下内容

现在我的扩展客户来玩了。这就是我使用它的方式:

问题是如何以更好的方式实现getT和运行。postT

我将发布我当前的解决方案,但希望这里更有经验的haskellers可以提出更好的解决方案