You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Restify中全局修改API响应后发送给客户端?

在Restify中全局修改API响应的方案

嘿,这个需求完全可以通过Restify的全局中间件来实现,再也不用在每个API里重复写转换逻辑啦!下面给你两种靠谱的实现方式,你可以根据自己的业务场景选:

方法一:重写res.send方法(推荐)

这种方式能拦截所有通过res.send/res.json发送的响应,不管路由里怎么写,都会自动帮你转换字段,非常省心。

实现代码

// 定义一个全局中间件来设置响应转换
function setupGlobalResponseTransform(server) {
  server.use((req, res, next) => {
    // 先保存原始的send方法,避免覆盖后丢失功能
    const originalSend = res.send;

    // 重写send方法
    res.send = function(body) {
      // 跳过不需要转换的路由(可选,按需添加)
      if (req.skipResponseTransform) {
        return originalSend.call(this, body);
      }

      // 只处理对象类型的响应(如果是字符串/数字直接跳过)
      if (body && typeof body === 'object') {
        // 这里写你的字段转换逻辑
        const transformedBody = {};
        // 把uid转成sid
        if (body.uid !== undefined) {
          transformedBody.sid = body.uid;
        }
        // 把name转成username
        if (body.name !== undefined) {
          transformedBody.username = body.name;
        }
        // 如果你需要保留原响应的其他字段,可以用Object.assign合并
        // Object.assign(transformedBody, body);
        // 然后再覆盖特定字段
        // transformedBody.sid = body.uid;
        // delete transformedBody.uid;

        // 替换成转换后的body
        body = transformedBody;
      }

      // 调用原始的send方法发送转换后的数据
      return originalSend.call(this, body);
    };

    next();
  });
}

// 在你的Restify服务器初始化后调用这个函数
const server = restify.createServer();
setupGlobalResponseTransform(server);

// 示例路由
server.get('/user', (req, res, next) => {
  // 原响应对象
  const originalObj = { uid: 123, name: 'test' };
  res.send(originalObj);
  return next();
});

// 不需要转换的路由示例(可选)
server.get('/raw-user', (req, res, next) => {
  req.skipResponseTransform = true;
  res.send({ uid: 456, name: 'raw' });
  return next();
});

方法二:使用Restify的after中间件

这种方式是利用Restify的生命周期中间件,在路由处理完成后、响应发送前修改res.body:

实现代码

const restify = require('restify');

const server = restify.createServer();

// 注册after中间件(注意要放在路由之前)
server.use(restify.plugins.after());
server.use((req, res, next) => {
  // 同样可以加跳过标记
  if (req.skipResponseTransform) {
    return next();
  }

  if (res.body && typeof res.body === 'object') {
    // 执行字段转换
    const transformed = {};
    if (res.body.uid) transformed.sid = res.body.uid;
    if (res.body.name) transformed.username = res.body.name;
    // 替换res.body
    res.body = transformed;
  }
  next();
});

// 示例路由
server.get('/user', (req, res, next) => {
  res.send({ uid: 123, name: 'test' });
  return next();
});

注意事项

  • 如果你的响应有嵌套对象或者数组需要转换,可以在转换逻辑里递归处理,比如写一个通用的转换函数。
  • 记得处理null和数组的情况,避免报错。
  • 不需要转换的路由可以通过req.skipResponseTransform标记跳过,灵活度很高。

内容的提问来源于stack exchange,提问作者Sachin Shah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:46:46