Express项目中/api/hotels接口404问题排查求助
问题描述
我正尝试通过POST请求创建新酒店,目前应用已正常运行:后端连接成功、MongoDB连接也没问题,但访问/api/hotels接口时一直报错,提示「Cannot POST /api/hotels - 404 not found」和「Cannot GET /api/hotels」。以下是相关代码,请问问题出在哪?
routes/hotels.js
import express from "express"; import Hotel from "../models/Hotel.js"; import { createHotel, deleteHotel, getHotel, getHotels, updateHotel, } from "../controllers/hotel.js"; const router = express.Router(); //CREATE router.post("/", createHotel); //UPDATE router.put("/:id", updateHotel); ///DELETE router.delete("/:id", deleteHotel); //GET router.get("/:id", getHotel); //GET ALL router.get("/", getHotels); export default router;
controllers/hotel.js
import Hotel from "../models/Hotel.js" export const createHotel = async (req,res,next)=>{ const newHotel = new Hotel(req.body); try{ const savedHotel = await newHotel.save(); res.status(200).json(savedHotel); } catch (err) { next(err); } }; export const updateHotel = async (req,res,next) => { try { const updatedHotel = await Hotel.findByIdAndUpdate( req.params.id, { $set: req.body }, { new: true } ); res.status(200).json(updatedHotel); } catch (err) { next(err); } }; export const deleteHotel = async (req, res, next) => { try { await Hotel.findByIdAndDelete(req.params.id); res.status(200).json("Hotel has been deleted."); } catch (err) { next(err); } }; export const getHotel = async (req, res, next) => { try { const hotel = await Hotel.findById(req.params.id); res.status(200).json(hotel); } catch (err) { next(err); } }; export const getHotels = async (req, res, next) => { try { const hotels = await Hotel.find(); res.status(200).json(hotels); } catch (err) { next(err); } };
index.js
// import express from "express"; // import dotenv from "dotenv"; import mongoose from "mongoose"; import express from "express"; import authRoute from "./routes/auth.js"; import usersRoute from "./routes/users.js"; import hotelsRoute from "./routes/hotels.js"; import roomsRoute from "./routes/rooms.js"; const app = express(); // dotenv.config() const connect = async ()=>{ try { await mongoose.connect('mongodb+srv://******@******.mongodb.net/?retryWrites=true&w=majority'); // Check how we can use .env file console.log("Connected to mongoDB.") } catch (error) { throw error } }; mongoose.connection.on("disconnected", ()=>{ console.log("mongoDB disconnected!") }) mongoose.connection.on("connected", ()=>{ console.log("mongoDB connected!") }) // middlewares app.use(express.json()) app.use("api/auth", authRoute); app.use("api/users", usersRoute); app.use("api/hotels", hotelsRoute); app.use("api/rooms", roomsRoute); app.use((err, req,res,next)=>{ return res.status(500).jsom("Hello error from handler!") }) app.listen(8800, ()=>{ connect() console.log("Connected to backend.") app.get('/', (_, res) => res.send({message: 'Hello from Express'})) });
问题解决
核心错误:index.js中路由挂载的前缀缺少开头的斜杠/,导致Express无法正确识别/api/hotels这类路径。
修正步骤:
- 修复路由前缀
将index.js中的路由挂载代码修改为:
app.use("/api/auth", authRoute); app.use("/api/users", usersRoute); app.use("/api/hotels", hotelsRoute); app.use("/api/rooms", roomsRoute);
- 修正错误处理的拼写问题
错误处理中间件里的jsom是拼写错误,改为json:
app.use((err, req,res,next)=>{ return res.status(500).json("Hello error from handler!") })
- 调整根路由的注册位置
不要把app.get('/')放在app.listen的回调中,移到app.listen之前:
app.get('/', (_, res) => res.send({message: 'Hello from Express'})) app.listen(8800, ()=>{ connect() console.log("Connected to backend.") });
完成以上修改后,重新启动服务,/api/hotels的POST和GET请求就能正常访问了。
内容的提问来源于stack exchange,提问作者amerigo
相关产品推荐
相关产品推荐

