首页 > 解决方案 > 使用父/子路由文件的奇怪行为

问题描述

我有一个带有 TypeScript 的 Node/Express 后端。

如果我在更改和保存文件后在 Postman 中运行根路由,localhost:8000/我会得到正确的响应。但是,如果我localhost:8000/user在更改并保存文件后运行,我会收到自动 404 HTML 响应。

只有当我首先运行根路由然后运行子路由时,它才有效。

我在这里做错了什么?

索引.ts

// External
import express from 'express';
import mongoose from 'mongoose';
import bodyParser from 'body-parser';

// Internal
import { uri } from '../backend/config/dbConsts';
import masterRoute from './api/masterRoute';

module.exports.mongoose = mongoose;

const app = express();
const PORT = 8000;

app.use(bodyParser.urlencoded({ extended: true }));

// Defines the routes used.
app.use('/', masterRoute);

app.listen(PORT, () => {
  console.log(`⚡️[server]: Server is running at https://localhost:${PORT}`);

  mongoose.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true });
  var db = mongoose.connection;
  db.on('error', console.error.bind(console, 'MongoDB connection error:'));
});

export default app;

主路由.ts

import express, { Router } from 'express';
import userRoute from './routes/user.route';
const router: Router = express.Router();

router.get('/', async (req, res, next) => {
  router.use('/user', userRoute);
  
  // Returning 400 here since all requests must enter into an actual routing file.
  res.status(400).send('Bad route. masterRouter.');
});

export default router;

用户路由.ts

import express, { Router } from 'express';
const router: Router = express.Router();
import userController from '../../controllers/user.controller';

router.get('/', async (req, res, next) => {
  try {
    const users = await userController.getAllUsers();
    res.status(200).send(users);
  } catch (err) {
    next(err);
  }

});

});

export default router;

标签: javascriptnode.jstypescriptexpressroutes

解决方案


我想出了我的问题。我错误地设计了路由系统。

我完全删除了主路由文件。这是更新的index.ts文件(所有其他文件不再需要并被删除)。

// External
import express from 'express';
import mongoose from 'mongoose';
import bodyParser from 'body-parser';

// Internal
import { uri } from '../backend/config/dbConsts';
import masterRoute from './api/masterRoute';

module.exports.mongoose = mongoose;

const app = express();
const PORT = 8000;

app.use(bodyParser.urlencoded({ extended: true }));

// Defines the routes used.
app.use('/', userRoute);
app.use('/second', secondRoute);

app.listen(PORT, () => {
  console.log(`⚡️[server]: Server is running at https://localhost:${PORT}`);

  mongoose.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true });
  var db = mongoose.connection;
  db.on('error', console.error.bind(console, 'MongoDB connection error:'));
});

export default app;

推荐阅读