Express:在json()之后调用next() - Middlewares

时间:2015-10-08 12:46:51

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

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

  1. 第一个是记录传入的请求
  2. 第二个将记录已处理的响应(JSON
  3. 第一个中间件(在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 sent; this is the related super cool response我的问题是,用json()编写json数据并添加第二个中间件是不兼容的吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

请勿在{{1​​}}内拨打->add('photo','file',array( 'attr' => array("class"=>"filestyle", "data-iconName"=>"glyphicon-inbox", "data-buttonText"=>"Scegli foto..", "data-buttonName"=>"btn-primary", "data-iconName"=>"glyphicon-folder-open"), 'label'=>'user.file.label', 'required'=>false, ) ) 。没有其他事可做,所以调用next()可能会将您发送到Express的默认404处理程序,该处理程序尝试使用默认状态和正文进行响应。

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