【问题标题】:Transforming a payload from requestjs before sending it to the client在将有效负载发送到客户端之前从 requestjs 转换有效负载
【发布时间】:2019-04-26 19:55:36
【问题描述】:

兄弟姐妹们,我正在构建一个 Express API Endpoint,它需要使用外部 API,对键和值进行一些更改,并将结果返回给客户端。到目前为止,这是我所拥有的:

const external_endpoint = <external_api_end_point>;

app.get('/', function (req, res, next) {

  request({ url: external_endpoint}).pipe(res);
});

这将返回您直接点击external_endpoint 所获得的确切有效负载。

res 发送给客户之前,我不能做些什么来更改它吗?我尝试了一些东西,但没有任何效果。与对传入有效负载进行转换相关的任何想法或最佳实践?

为了简单起见。假设这是有效载荷obj.json

{
    "sad": {
        "userid": 5,
        "username": "jsmith",
        "isAdmin": true
    }
}

我想将sad 更改为happy

我知道在请求之外我可以做这样的事情:

obj = JSON.parse(JSON.stringify(obj).split('"sad":').join('"happy":'));

但是用obj 代替res 是行不通的。我已经尝试分配这个resres.body 的值,但没有骰子。

提前感谢您的帮助!

【问题讨论】:

  • 你能解释一下request 是什么吗?这可能有多个库。
  • 正确。很抱歉没有澄清这一点。我正在使用request ^2.88.0。这是 github 存储库的链接github.com/request/request
  • 知道了。是的,基本的request 模块处理流式传输以表达响应作为一等公民。所以你可以使用我在答案中概述的event-stream 方法。

标签: node.js json api express requestjs


【解决方案1】:

如果您使用的是request-promise,您可以简单地做出新的回复并发送,或者修改您收到的回复:

app.get('/', function (req, res, next) {    
    request({ url: external_endpoint, json: true})
        .then(response => res.json({ happy: response.sad })))
        .catch(next);
});

(当然,你需要适当地处理错误)

如果您想将其作为流处理(如果您有大量数据,这很有意义),您可以使用原始的request 模块,并使用event-stream 创建您的管道:

const es = require('event-stream');

const swapper = es.through(
    function write(data) {
        this.emit("data", data.replace("sad", "happy"));
    },
    function end() {
        this.emit("end");
    }
);

request({ url: external_endpoint})
    .pipe(es.stringify())
    .pipe(swapper)
    .pipe(es.parse())
    .pipe(res);

这是一个测试流处理的沙盒:https://codesandbox.io/s/3wqx67pq6

【讨论】:

  • 在上面使用await的代码中,您需要在函数之前添加async,否则等待将返回未定义。
  • 所以在.pipe(es.map(j =&gt; j.replace('sad', 'happy')) 上,我们似乎缺少了一个结束)。但是,即使我将其添加到行尾,它也无法按预期工作。我尝试添加到.pipe(res)) 的末尾,它返回有效负载,但没有进行任何替换。
  • 确实,es.map() 不正确,因为此时我们正在接收一个字符串。替换为es.through()
  • 顺便说一句,codeandbox 链接有问题,但我认为它现在可以正常工作了。
  • 很棒,但希望能做得更好一点。假设某人在他们的用户名中(或任何值)中有 sad 这个词。有什么可以防止或确保.replace 不会改变该值?我试图将data.replace("sad", "happy") 更改为data.replace('"sad":', '"happy":'),但包含引号似乎会破坏替换的工作。关于如何仅针对更改键而不是数据的任何想法?到目前为止,你一直是一个巨大的帮助。谢谢你的一切。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2018-08-06
相关资源
最近更新 更多