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
相关产品推荐
相关产品推荐

