我正在尝试构建一个使用 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/json
127.0.0.1:3000/示例时,我的程序崩溃并出现"结束后写入"错误。我尝试了以下方法:
- 如果我将内容类型设置为其他内容(如文本/纯文本),它不会崩溃,但 JSON 未正确捕获(我的日志"解析的请求正文"显示一个空对象)。
- 如果我删除
res.write('ok');
,它也不会崩溃(并返回一个空字符串),但这意味着我无法返回东西,这是不可接受的。 - 如果我删除整个
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();
});