javascript - Express:在 json() 之后调用 next() - 中间件

标签 javascript node.js express http-headers middleware

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

  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();
}

Controller 函数(在 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 发出请求会显示:发送后无法设置 header this is the related super cool response我的问题是,使用 json() 写入 json 数据并添加第二个中间件是否不兼容?我该如何解决这个问题?

最佳答案

不要在logResponseMiddleware内调用next()。没有其他事情可做,因此调用 next() 可能会将您发送到 Express 的默认 404 处理程序,该处理程序会尝试使用默认状态和正文进行响应。

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

关于javascript - Express:在 json() 之后调用 next() - 中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33016269/

相关文章:

javascript - 直接对数据库操作执行等待将给出未定义的结果

javascript - Dojo 教程 - 业务应用程序架构

javascript - 在 DOM (html) 上下文中使用 Angular 作用域函数时出现的问题

node.js - Angular 2 指令作为 npm 包

node.js - express/jade 获取当前用户 View

带有 Ajax 回调的 Javascript 线程

用于仅 TLS 连接协商的 Node.js TLS 选项

Node.js - 等待文件完全写入

node.js - 不同客户端 Nodejs 的 session id 相同

javascript - 同步访问两个远程资源并在组合响应中输出 - NodeJS