Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Редирект на Nodejs (https://javascript.ru/forum/node-js-io-js/69803-redirekt-na-nodejs.html)

АнонимныйПарень 18.07.2017 22:07

Редирект на Nodejs
 
Использую Express. Вопрос: есть ссылка в .jade файле, по нажатию на ссылку не открываеться другой .jade файл. ПОЧЕМУ?

Вот код Jade (Pug):

a(href='../file.jade', style='color: white;') Ссылка

Вщт JS:

exports.courses = function(req, res){
  	res.render('../file.jade', { title: 'Express' });
};

app.get('/', routes.index);
app.get('../file.jade', routes.file);


Не знаю что еще отправить, напишите что нужно для решения моей "проблемы" и я отправлю эту часть кода. Пожалуйста, помогите!

destus 19.07.2017 11:45

Браузер не сможет тебе отрисовать твой jade файл. То есть должно быть что-то типо
a(href='/blabla', style='color: white;') Ссылка

И должен быть middleware, который будет обрабатывать путь /blabla и рендерить твой file.jade с нужным контекстом
app.get('/blabla', function(req, res){
res.render('path/to/file.jade')
})

Audaxviator 19.07.2017 11:53

Не мидловер, а простой обработчик запроса (в данном случае).
Это я написал примерно же самое, но оказалось - что уже написано. Пришлось удалить.
Короче, ссылка (href) - это обычный GET-запрос, которому нужен обычный обработчик.

destus 19.07.2017 12:18

Цитата:

Сообщение от Audaxviator (Сообщение 458991)
Не мидловер, а простой обработчик запроса (в данном случае).

Вы не поверите, но это синонимы.

АнонимныйПарень 19.07.2017 12:25

а относительный путь относительно какого файла писать?

destus 19.07.2017 12:31

АнонимныйПарень,
Вы указали путь к папке с шаблонами? Что-то типа
app.set('views', './templates')

Если да, то путь и указывается относительно папки templates. http://expressjs.com/ru/guide/using-...e-engines.html

АнонимныйПарень 19.07.2017 12:34

вот мои middleware:
/**
 * Module dependencies.
 */

var express = require('express');
var routes = require('./routes');
var http = require('http');
var path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);

app.get('/courses', function(req, res){
res.render('courses.jade');
})


http.createServer(app).listen(app.get('port'), function(){
  console.log('App is working on port ' + app.get('port'));
});

АнонимныйПарень 19.07.2017 12:35

Пишет Cannot GET /courses

Audaxviator 19.07.2017 13:04

Нет, это не синонимы.
Из любого обработчика можно сделать мидловер - добавив третий аргумент next.
Это делают довольно часто, на самом деле. Например, таким способом оченно просто запретить "злому хаккеру" попасть на страницу, на которую должны попадать только заргистрированные юзеры. Просто пишешь первой строчкой в обработчике -
if(!req.user) return next();
- и запрос пройдёт дальше и закончится на хендлере Page not found.
Так что, ну какие же это синонимы?
Ну да ладно, мне всё равно.

АнонимныйПарень 19.07.2017 13:16

ответьте на мой вопрос выше

Audaxviator 19.07.2017 13:17

У вас путь к шаблонам прописан в папку views. Убедитесь, что эта папка существует в корне проекта и что ваш courses.jade лежит в этой папке.

Audaxviator 19.07.2017 13:24

А, ешкин кот. Вот это:

app.get('/', routes.index);

app.get('/courses', function(req, res){
  res.render('courses.jade');
});

Должно быть перед еррорХендлером.

АнонимныйПарень 19.07.2017 13:52

Спасибо, огромное! Ты настоящий друг!:) Помог!!! +99999999999 в карму!

АнонимныйПарень 19.07.2017 14:16

Только смотри: если все мои файлы находятся в папке views, то все работает. Но если в папке views есть папка tabs (в ней file.jade) и файл index.jade, то как мне правильно поставить путь к file.jade?

Что писать тут:
a(href='ЧТО ПИСАТЬ ТУТ?', style='color: white;') Ссылка

Что писать тут:

app.get('ЧТО ПИСАТЬ ТУТ?', function(req, res){
	res.render('ЧТО ПИСАТЬ ТУТ?');
});

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

Audaxviator 19.07.2017 15:40

Путь к шаблонам задан вот здесь -
app.set('views', path.join(__dirname, 'views'));
- от этого места и отсчёт. Соответственно:
res.render('tabs/file');

Что написано в строке запроса - не имеет значения. На клиенте написано href="/gfgfgfgfgfg" - на сервере то же самое - app.get('/gfgfgfgfgfg', ... Тут главное - придумывать что-нибудь разумное и соответствующее по смыслу, чтоб самому же и удобно было.

Шаблоны можно делить на слои (layouts) и миксины (mixins). Поэтому обычно создают папку templates, а в ней папки layouts, mixins и views, путь указывают так -
app.set('views', path.join(__dirname, 'templates/views'));
- а уж отсюда подгружаются - типа
extends ../layouts/default
и т.д. - составные части каждой страницы.
А при рендеринге расширение и не нужно - res.render('bla');

Audaxviator 19.07.2017 15:52

А, и все эти index тут не работают. Шаблонизатору до фени имя index, никакого приоритета оно не имеет. Какое имя написано в коде - res.render('blabla'); - тот файл и рендерится. Написано res.render('index') - будет index.jade
Ноде - не до фени: увидит в указанной папке файл index.js - будет его исполнять автоматически.

Audaxviator 19.07.2017 19:30

Я кое-что попробовал и справил выше.

АнонимныйПарень 22.07.2017 10:55

Cannot GET /tabs/courses

Вот что пишет! Не понимаю в чем ошибка

Audaxviator 22.07.2017 15:16

Хе. Догадываюсь, что эта строчка написана в запросе, в аргументе тэга - href="/tabs/courses"
Но я не медиум, конечно.
Если это так, то перечитайте внимательно мой предыдущий камент.
В Ноде есть одна замечательная вещь (тут много замечательных вещей, но и эта тоже): pathname запроса не связан непосредственно с обработчиком этого запроса. С в строке запроса чего-то написано, но обработчику безразлично - чего там написано. Он просто прикручен к этому "чего-то" в качестве обработчика в этой вот строчке после запятой
app.get('/hfhgjhlj/gfhf', ... ...);
но ему всё равно, чего там написано.


Часовой пояс GMT +3, время: 16:46.