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

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这类路径。

修正步骤:

  1. 修复路由前缀
    将index.js中的路由挂载代码修改为:
app.use("/api/auth", authRoute);
app.use("/api/users", usersRoute);
app.use("/api/hotels", hotelsRoute);
app.use("/api/rooms", roomsRoute);
  1. 修正错误处理的拼写问题
    错误处理中间件里的jsom是拼写错误,改为json:
app.use((err, req,res,next)=>{
 return res.status(500).json("Hello error from handler!")
})
  1. 调整根路由的注册位置
    不要把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:45:38