我是Ramda的新手,我想知道如何完成一项简单的任务:
我有一个动作,我只想返回请求正文
MobileServiceClient MobileService = new MobileServiceClient("https://{your-appname}.azurewebsites.net");
我试过镜头,但没有成功
router.post('/', ctx => {
ctx.body = ctx.request.body
})
如何让它以优雅的方式运作?
答案 0 :(得分:2)
这是你想要达到的目标吗?
const ctx = {
request: {
body: 'hello'
}
}
const bodyLens = R.lensPath(['body'])
const reqLens = R.lensPath(['request', 'body'])
const _set = R.pipe(R.view(reqLens), R.set(bodyLens))
console.log(_set(ctx)(ctx))

<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script>
&#13;
更新如果您希望以无点样式实现ctx => _set(ctx)(ctx)
,那么如何简化功能并导入converge
?
const ctx = {
request: {
body: 'hi'
}
}
const _set2 = R.converge(R.assoc('body'), [R.path(['request', 'body']), R.identity])
console.log(_set2(ctx));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script>
&#13;
答案 1 :(得分:1)
如果你想以不可变的方式读/写道具,镜头实际上是可以的。
要使您的函数无点且避免多次传递ctx
,您可以使用R.chain
代替pipe
const ctx = {
request: {
body: 'test'
}
}
const setBody = R.chain(
R.set(R.lensPath(['body'])),
R.view(R.lensPath(['request', 'body']))
)
console.log(ctx, setBody(ctx))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script>