"write after end" Express 及其 json 解析器的错误



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

我的(简化了很多)(打字稿)代码如下:

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/json127.0.0.1:3000/示例时,我的程序崩溃并出现"结束后写入"错误。我尝试了以下方法:

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

是我做错了什么,还是不可能做我想做的事情,我应该坚持选项 3?

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

最新更新