You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js + TypeScript自定义中间件创建及无响应问题排查指导

在Express/TypeScript中创建自定义中间件并解决响应返回问题

看起来你现在的日志中间件是典型的传递型中间件——它只做日志记录,然后通过next()把请求传递给后续处理逻辑,但本身并不返回响应。如果你的问题是「想要让中间件直接返回响应(比如拦截请求)」或者「请求没有得到任何响应」,我来帮你拆解解决:

问题1:请求没有得到响应(原代码的潜在问题)

你的原代码里只注册了日志中间件,但没有定义任何路由来处理请求。当请求到达时,中间件执行完日志后调用next(),但没有后续路由匹配,Express会默认返回404 Not Found,看起来就像是「没有返回响应」。

解决方法很简单,添加一个路由来处理请求:

import express from 'express';
const app = express();

// 你的日志中间件
app.use(function log(req, res, next) {
  console.log('logging with fun...');
  next(); // 传递请求到下一个处理环节
});

// 添加路由,负责返回响应
app.get('/', (req, res) => {
  res.send('Hello there! This is your response.');
});

const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Listening on port: ${port}`));

现在访问http://localhost:3000,就能看到路由返回的响应了。

问题2:想让中间件直接返回响应(比如拦截请求)

如果你的需求是让中间件在某些条件下直接返回响应(比如权限校验失败、参数错误),只需要调用res对象的响应方法(send()/json()/status()等),并且不要调用next()(否则会导致「响应已发送」的错误)。

举个权限校验中间件的例子:

import express from 'express';
const app = express();

// 自定义权限校验中间件
app.use((req: express.Request, res: express.Response, next: express.NextFunction) => {
  console.log('Checking user permissions...');
  
  // 模拟权限校验逻辑
  const isAuthenticated = false; // 假设用户未登录
  if (!isAuthenticated) {
    // 直接返回401响应,终止请求流程
    return res.status(401).json({ message: 'Please log in first' });
  }
  
  // 校验通过,继续传递请求
  next();
});

// 只有中间件放行,这个路由才会执行
app.get('/dashboard', (req, res) => {
  res.send('Welcome to your dashboard!');
});

const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Listening on port: ${port}`));

TypeScript类型提示优化

为了让中间件的类型更清晰,可以显式标注req、res、next的类型:

app.use((req: express.Request, res: express.Response, next: express.NextFunction) => {
  console.log(`[${new Date().toISOString()}] ${req.method} ${req.path}`);
  next();
});

这样编辑器会给你完整的类型提示,避免写错方法。


内容的提问来源于stack exchange,提问作者MWN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:59:27