2016-12-17 1 views
0

Возможно, я сформулировал вопрос неправильно ...Неверный экспресс-маршрут срабатывает?

Я пытаюсь создать сократитель URL, используя Node.js, Express, MongoDB (mongoose).

Я установил его так, что когда пользователь загружает домашнюю страницу, они перенаправляются на главную страницу.

// horribly designed home page 
app.get('/', function(req, res){ 
    res.render('index'); 
    res.end(); 
}); 

Эта часть работает. Пользователь успешно видит домашнюю страницу.

Но тогда, у меня есть следующий код:

// redirects to corresponding url 
app.get('/:digits', function(req, res){ 
    console.log('getting full url from database'); 
} 

Каждый раз, когда пользователь переходит к домашней странице (/), этот путь также срабатывают и я вижу «полный URL из базы данных» в консоли.

Почему это?

Full code is here

+0

Браузер отправляет запрос на '/ favicon.ico' и, следовательно, также запускается путь' /: цифр. Отправьте запрос curl на свою домашнюю страницу, например 'curl http: // localhost: 3000 /', и вы увидите, что маршрут '/: digits' не запускается. – dikesh

ответ

0

Заканчивать этот раздел на Маршрут параметры:

http://expressjs.com/en/guide/routing.html Из официальной документации:

Этот запрос URL:

http://localhost:3000/users/34/books/8989 

будут направляться на этот путь:

/users/:userId/books/:bookId 

и req.params объект будет

{ "userId": "34", "bookId": "8989" } 

В вашем случае: когда я попробовал его в хроме я получил req.params.digits как 'favicon.ico'.

Это означает, браузер делает два запроса:

  1. к '/' путь
  2. к '' /favicon.ico

Второй запрос поэтому маршрут запускается.

Вы можете попробовать добавить console.log код, чтобы увидеть, что ваш браузер посылает

app.get('/:digits', function(req, res){ 
    console.log('getting full url from database'); 
    console.log(req.params.digits); 
}); 

Вы можете также использовать 'режим разработчика' (Chrome), Firebug (Firefox) для проверки.

+0

Хм, это странно. Я не могу понять, почему req.params.digits будет «favicon.ico» –

+0

Я также до сих пор не могу понять, почему app.get (/: цифры) запускается каждый раз, когда браузер делает запрос на главную страницу –

+0

Запрос на /favicon.ico, который является значком webiste. Это срабатывает на основе моего объяснения. – RLaaa

0

Я просматриваю ваш код, и я думаю, что вы можете пропустить пару вещей.

У вас есть настройка 'views' folders? Используя res.render, express ожидает рендеринга «view» из папки «views» с движком просмотра «ejs».

Я обнаружил, что без того, чтобы эта папка, явно определенная в моей структуре, была проблемой, когда дело доходит до маршрутизации.

+0

Да, у меня есть папка views с index.ejs внутри. Извините, должен был упомянуть об этом в исходном сообщении –

+0

Не уверен, что это помогает ... но вы пробовали комментировать параметр res.end() после оператора res.render()? –

+0

Не уверен, что это помогает ... но вы пробовали комментировать параметр res.end() после оператора res.render()? Не уверен, что это поможет ... но я также проверил бы, как вы делаете свои статические файлы. i.e. app.use ('/ static', express.static (path.join (__ dirname, 'public'))) https://expressjs.com/ru/starter/static-files.html –