Express - невозможно импортировать маршруты - PullRequest
0 голосов
/ 01 февраля 2020

У меня следующая структура:

// app.js
const express = require("express");
const app = express();

app.get("/", require("./routes/index"));
app.get("/users", require("./routes/users"));

app.listen(3000);

// /routes/index.js
const express = require("express");
const router = express.Router();

router.get("/", (req, res) => res.send("index"));

module.exports = router;

// /routes/users.js
const express = require("express");
const router = express.Router();

router.get("/login", (req, res) => res.send("login"));
router.get("/register", (req, res) => res.send("register"));

module.exports = router;

Если я использую app.use(...) внутри app.js, тогда маршруты работают правильно, но я хочу использовать app.get, так как я хочу заблокировать любой другой доступный метод.

В данный момент индексный маршрут работает нормально, но другие маршруты не работают.

Рабочая песочница: https://codesandbox.io/s/cocky-cartwright-h82d2?fontsize=14&hidenavigation=1&theme=dark

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Правильный способ добиться того, что вы пытаетесь - это использовать функцию «use».

Вы сказали, что не хотите использовать app.use, потому что хотите заблокировать любой другой доступный метод , но использование функции 'use' не позволит ничего, что не было объявлено на ваших маршрутизаторах, поэтому вам не нужно об этом беспокоиться.

Что app.use делает, это регистрирует функцию промежуточного программного обеспечения для ваше приложение по указанному маршруту. Итак, код ниже:

app.use("/users", require("./routes/users"));

сделает так, что каждый запрос, соответствующий шаблону '/ users', будет использовать предоставленную вами функцию (в данном случае маршрутизатор внутри файла users. js) .

Итак, если кто-то отправит запрос POST в / users / register, например, он получит 404, потому что вы никогда не создавали маршрут для обработки сообщения по этому пути.

И просто, чтобы понять, почему app.get не работает так, как вы, позвольте мне дать краткое объяснение.

Когда вы используете функцию app.get, ожидается, что запрос путь совпадает с тем, который вы указали. Итак, когда вы делаете следующее:

app.get("/users", require("./routes/users"));

Сервер будет ожидать запрос, который точно соответствует / users. Таким образом, что-то вроде / users / example не вызовет функцию обратного вызова.

Дело в том, что функция для обработки запроса в приведенном выше коде - это другой маршрутизатор:

router.get("/login", (req, res) => res.send("login"));
router.get("/register", (req, res) => res.send("register"));

Итак, маршрутизатор будет ожидать, что путь запроса совпадает с / users / login или / users / register. Но если путь запроса совпадает с / users / register, он не будет совпадать с / users, поэтому ничего не будет вызываться.

Причина, по которой ваш путь '/' работает прямо сейчас, заключается в том, что ваш маршрутизатор ожидает того же путь, который вы использовали в файле приложения. js. Таким образом, запрос «/» будет соответствовать обоим шаблонам.

0 голосов
/ 01 февраля 2020

вы не можете использовать router.get и передать маршрутизатор router.get ожидать получить метод (функцию). Вы должны использовать app.use или использовать такие контроллеры

// /controllers/index.js
exports.renderIndex = (req, res) => {

    res.send("index")

}


и в приложении. js

// app.js
const express = require("express");
const app = express();
const indexController = require("./controllers/index");

app.get("/", indexController.renderIndex);

app.listen(3000);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...