繁体   English   中英

Ramda作为请求主体返回响应

[英]Ramda return response as request body

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

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

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

我尝试过镜头,但没有成功

const bodyLens = R.lensPath(['ctx', 'body'])
const reqLens = R.lensPath(['ctx','request', 'body'])

const set = R.pipe(R.view(reqLens), R.set(bodyLens))
router.post('/', ctx => {
    set(ctx)(ctx)
    ctx.body = ctx.request.body
})

如何使其以优雅的方式工作?

这是您要达到的目标吗?

 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> 

更新如果要以无点样式实现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)); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script> 

如果您想以不变的方式读/写道具,那么镜片实际上是可以的。 为了使函数无指向并避免多次传递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> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM