Ramda作为请求体返回响应

时间:2017-08-21 02:12:19

标签: javascript ramda.js

我是Ramda的新手,我想知道如何完成一项简单的任务:

我有一个动作,我只想返回请求正文

MobileServiceClient MobileService = new MobileServiceClient("https://{your-appname}.azurewebsites.net");

我试过镜头,但没有成功

router.post('/', ctx => {
    ctx.body = ctx.request.body
})

如何让它以优雅的方式运作?

2 个答案:

答案 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;
&#13;
&#13;

更新如果您希望以无点样式实现ctx => _set(ctx)(ctx),那么如何简化功能并导入converge

&#13;
&#13;
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;
&#13;
&#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>

相关问题