在将其发送到客户端之前从 requestjs 转换有效负载

Transforming a payload from requestjs before sending it to the client

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

const external_endpoint = <external_api_end_point>;

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

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

这 return 是您直接点击 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-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