Проблема маршрутизации ExpressJS, простые вещи не решаются

Я недавно переместил весь свой код маршрута в отдельные файлы, но теперь мое разрешение маршрута нечеткое. Вот простой пример -

Мой app.js

const express = require('express');
const app = express();

var dataLoader = require('./routes/dataLoader');
app.all( '/api/load', dataLoader);

Мой dataLoader.js

const express = require('express');
const router = express.Router();

router.get('/api/load', (req, res) => {
    res.send('Hello Loader...');
});

router.get('/api/load/bob', (req, res) => {
   res.send('Hello Loader - Bob...');
});

router.get('/api/load/jim', (req, res) => {
   res.send('Hello Loader - Jim...');
});

module.exports = router;

/ api / load работает нормально, в то время как /api/load/jim и / api / load / bob оба приводят к:

Cannot GET /api/load/jim (or Cannot GET /api/load/bob, respectively) 

Я использую app.all() вместо app.use(), потому что у меня возникла проблема, связанная с решением основного пути "/ api / load", использование all, похоже, исправило это, но теперь я не уверен.

"engine": { "node": "^8.9.1" }, "dependencies": { "bluebird": "^3.5.1", "body-parser": "^1.15.1", "express": "^4.13.4", "mongoose": "4.9.8" } есть предложения?

1 ответ

Решение

Когда вы делаете это:

app.all( '/api/load', dataLoader);

И тогда в dataLoader роутер, вы определяете маршруты следующим образом:

router.get('/api/load', (req, res) => {
    res.send('Hello Loader...');
});

То, что вы на самом деле делаете, это определение маршрута для api/load/api/load что скорее всего не то, что вы хотите. Пути являются накопительными.

app.use() оператор должен иметь любой общий префикс, применимый ко всему маршрутизатору, и тогда пути на самом маршрутизаторе должны быть относительно этого. Кроме того, вы должны использовать с помощью app.use()не app.all() для роутера.

Итак, в вашем случае измените dataLoader маршрутизатор к этому:

// whole router is configured at /api/loader
const router = require('express').Router();

router.get('/', (req, res) => {
    res.send('Hello Loader...');
});

router.get('/bob', (req, res) => {
   res.send('Hello Loader - Bob...');
});

router.get('/jim', (req, res) => {
   res.send('Hello Loader - Jim...');
});

module.exports = router;
Другие вопросы по тегам