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

Express-TypeScript登录接口无响应问题排查求助

问题

使用Express-TypeScript开发登录功能时,向登录接口发送POST请求无任何响应,检查代码未找到原因,相关代码如下,请帮忙排查。

登录控制器

export const login = asyncErrorHandler(
  async (
    req: Request<{}, {}, LoginRequestBody>,
    res: Response,
    next: NextFunction
  ) => {
    console.log(req.body);
    const { phoneNumber, password } = req.body;

    if (!phoneNumber || !password) {
      return next(new ErrorHandler(400, "Please enter all the details"));
    }
    console.log(req.body);

    if (!validatePhoneNumber(phoneNumber)) {
      return next(new ErrorHandler(400, "Please Enter correct phoneNumber"));
    }
    console.log(req.body);

    let user = await User.findOne({ phoneNumber });
    if (!user) {
      return next(new ErrorHandler(400, "User doesn't exists"));
    }

    if (password.length < 8) {
      return next(
        new ErrorHandler(400, "Password should consists atleast 8 charecter")
      );
    }

    const verifyPass = verifyPassword(password, user.password as string);
    if (!verifyPass) {
      return next(new ErrorHandler(404, "Please enter correct credentionals"));
    }

    const data = {
      user: {
        id: user._id,
      },
    };

    const authtoken = token(data);

    return res
      .status(200)
      .json({
        success: true,
        authtoken,
        user,
      })
      .end();
  }
);

LoginRequestBody定义

export interface LoginRequestBody {
  phoneNumber: string,
  password: string
}

asyncErrorHandler实现

const asyncErrorHandler = (func: ControllerType) => {
  return (req: Request, res: Response, next: NextFunction) => {
    return Promise.resolve(func(req, res, next)).catch(next);
  };
};

index.ts

import express, { Request, Response } from "express";
import http from "http";
import cors from "cors";
import compression from "compression";
import helmet from "helmet";

import connect from "./connectDB";
import { authentication } from "./routes/authentication";
import { handleError } from "./middleware/errorHandling";

const app = express();

app.use(
  cors({
    credentials: true,
  })
);
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(helmet());
app.use(compression());

app.use("/api/v1/users", authentication);

const server = http.createServer(app);

connect();

server.listen(8080, () => {
  console.log("Server running on http://localhost/8080");
});

//middleware to handle errors
app.use(handleError);

authentication.ts

import express from "express";

import { getUser, login, signup } from "../controller/users";
import { fetchUser } from "../middleware/fetchUser";

const router = express.Router()

export const authentication = () => {
  //route - api/v1/users/signup
  router.post("/signup", signup);
  //router - api/v1/users/login
  router.post("/login", login);
  //route - api/v1/users/dynamicId
  router.get("/:id", fetchUser, getUser);

  return router
};

排查方案

  • 路由挂载错误:index.ts中app.use("/api/v1/users", authentication);存在核心问题,authentication是返回路由实例的函数,必须调用执行才能得到router对象,应改为app.use("/api/v1/users", authentication());,否则请求无法匹配到登录接口。
  • 数据库连接验证:检查connect()函数是否成功建立数据库连接,若连接失败,User.findOne会处于pending状态导致请求无响应。建议在connect中添加连接状态日志,或为数据库查询添加超时处理。
  • 错误处理中间件有效性:在handleError中间件中添加日志输出,验证是否有错误被触发但未返回响应,确保错误能被正确捕获并返回客户端。
  • 工具函数检查:确认validatePhoneNumber和verifyPassword函数无同步阻塞或未捕获的异常,比如无限循环、未处理的抛出错误。
  • 响应冗余调用:代码中res.json().end()是冗余的,res.json()会自动结束响应,建议移除.end()以保持代码简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:17:51