【问题标题】:Express: calling next() after json() - MiddlewaresExpress:在 json() 之后调用 next() - 中间件
【发布时间】:2015-10-08 12:46:51
【问题描述】:

使用 NodeJs 和 Express 构建 REST API:我的目标是实现 2 个最简单的Middlewares

  1. 第一个将记录传入的请求
  2. 第二个将记录处理后的响应(即JSON

第一个中间件(在 app.js 中)

function logReqMiddleware(req, res, next) {
  log.info('>>> %s at %s', req.method, req.path);
  next();
}

第二个中间件(在app.js中)

function logResponseMiddleware(req, res, next) {
  log.info('<<< %s (%s)', JSON.stringify(res), res.status);
  next();
}

控制器函数(在apiController.js中)

export var router = express.Router();
router.get('/', foo);

function foo(req, res, next) {
  res.status(200).json({ stupidExample: true });
  next();
}

构建应用程序(app.js)

var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(logReqMiddleware);
app.use('/api', apiController.router);
app.use(logResponseMiddleware);
var server = app.listen(3000, function(){ log.info('running'); });

现在,在localhost:3000/api 提出请求说:can't set headers after they are sentthis is the related super cool response我的问题是,用json()写json数据并添加第二个中间件是不是不兼容?我该如何解决这个问题?

【问题讨论】:

    标签: javascript node.js express http-headers middleware


    【解决方案1】:

    不要在logResponseMiddleware 内调用next()。没有别的事可做,所以调用 next() 可能会将您发送到 express 的默认 404 处理程序,该处理程序试图以默认状态和正文进行响应。

    除此之外:JSON.stringify(res) 不是你想要的。 res 是一个表示响应的对象实例(许多方法、内部状态属性等)。它不是响应正文内容字符串。由于res 是一个可写流,它不会保留响应正文内容供您记录,它只是尝试通过 HTTP 连接发送它。

    【讨论】:

    • 有什么方法可以检查res 的正文内容还是不可能?
    • 我不认为像你希望的那样在事后通用地做这件事很简单。务实的做法是在将其写入res 之前将其记录下来,但这更难集中。您可以将其存储在res 中的自定义属性中,例如res.bodyJson,然后集中记录并写入res,但总体而言,这里的API 不利于您的目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多