Express及其json解析器出现“后写”错误

时间:2019-05-30 14:05:09

标签: node.js express

我正在尝试构建一个使用Express通过JSON输入的API。这似乎很简单,但是我遇到了错误[ERR_STREAM_WRITE_AFTER_END]: write after end

我的(非常简化的)(TypeScript)代码如下:

import express from 'express';
const app = express();
const jsonParser = express.json();

app.use(async (req, res, next) => {
  // Common actions for all requests
  console.log('Raw request:', req);
  res.setHeader('Content-Type', 'application/json');
  await next();
  res.end();
});

app.post('/example', jsonParser, async (req, res) => {
  console.log('Parsed request body:', req.body);
  res.write('ok');
});

app.listen(3000);

当我发布一些JSON(简单地为{"test":"test"},并且以Content-Type: application/json到127.0.0.1:3000/example时,我的程序崩溃,并显示“结束后写入”错误。我尝试了以下操作:

  1. 如果我将Content-Type设置为其他内容(例如文本/纯文本),它不会崩溃,但是JSON无法正确捕获(我的日志“已解析的请求正文”显示为空对象)。
  2. 如果我删除res.write('ok');,它也不会崩溃(并返回空字符串),但这意味着我无法返回东西,这是不可接受的。
  3. 如果我删除整个app.use(...)部分,就可以了,但是我真的很希望能够对那里的所有路线进行+/-前后处理,所以这不是令人满意的选择要么。

我在做错什么吗,还是只是做不到我想做的事,而我应该坚持选择3号吗?

1 个答案:

答案 0 :(得分:0)

error预期的关闭(或结束)后,您正在写入response流。

await next(); // <-- This is calling you next middleware
res.end(); // meanwhile this is executed and closes the stream

您可以这样做:

app.use(async (req, res, next) => {
  // Common actions for all requests
  console.log('Raw request:', req);
  res.setHeader('Content-Type', 'application/json');
  next();
});

app.post('/example', jsonParser, async (req, res) => {
  console.log('Parsed request body:', req.body);
  res.write('ok');
  res.end();
});