Express res.render не отображает страницу

Я пытаюсь получить информацию с моего основного сайта. После того, как ввод будет отправлен, страница должна перенаправить на /view. Кажется, что он успешно перенаправляется на /view (потому что console.info() запускается, но res.render не работает. Если я вручную перейду на /view, он отобразит страницу.

Вот код моего файла app.js:

// load the things we need
var express = require('express');
var app = express();
let bodyParser = require("body-parser");
let article = '';



//Set the view engine to ejs
app.set('view engine', 'ejs');
app.use('/static', express.static('static'))
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json())



//Index page 
app.get('/', function (req, res) {
    res.render('index')
});

//Get the input from the form
app.post('/searcharticle', function (req, res) {
    article = req.body.article;
    res.redirect('/view')
    return article;
});
//Page to output the input
app.get('/view', function (req, res) {
    console.info(article)
    res.render('view', {
        article: article
    })
})

app.listen(8080);
console.info('Server on 8080');

А вот и мой структура папок

Спасибо за помощь!

есть ли ошибка?

mehta-rohan 30.08.2018 09:59

нет ошибок нет вывода @ mehta-rohan

Albert Koholić 30.08.2018 10:07

нужно увидеть структуру ваших папок

mehta-rohan 30.08.2018 10:09

Я добавил структуру папок в вопрос @ mehta-rohan

Albert Koholić 30.08.2018 10:17

Несвязано: в вашем коде есть состояние гонки, потому что вы храните article глобально. Данные, специфичные для запроса, не входят в глобальную область видимости. Вы можете, например, сохранить req.body.article в сеансе, файловой системе или базе данных. Или просто res.render прямо в обработчике POST (также нет необходимости возвращать из него что-либо, поскольку возвращаемое значение отбрасывается)

Prinzhorn 30.08.2018 12:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
5
5 069
5

Ответы 5

Предположим, у вас есть все ваши файлы .ejs в папке просмотров, попробуйте добавить эту строку в свой код:

const path = require('path'); //npm install -S path in your console to install path. 

//Set the view engine to ejs
app.set('views', path.join(__dirname, 'views'));  // add this one, change 'views' for your folder name if needed.
app.set('view engine', 'ejs');
app.use('/static', express.static('static'))
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json())

Я добавил строки, но он все еще не работает. Я получаю такие же результаты.

Albert Koholić 30.08.2018 10:26

не могли бы вы поделиться своей структурой папок?

vitomadio 30.08.2018 10:29

проблема может быть в app.set ('views', ..)

mehta-rohan 30.08.2018 10:32

Я добавил ссылку на структуру внизу вопроса

Albert Koholić 30.08.2018 10:33

Если вы запускаете свой сервер из каталога, отличного от статического, вам необходимо добавить относительный путь

app.use ('/ static', express.static (__ dirname '/ static'))

Но css работает, поэтому со статическими файлами проблем быть не должно.

Albert Koholić 30.08.2018 10:47

сначала используйте движок просмотра, а затем укажите каталог, в котором он будет использоваться.

 app.set('view engine', 'ejs');
 app.set('views', path.join(__dirname, 'views'));

а для статических файлов используйте

app.use('/static',express.static(PATH.join(__dirname+'/static'));

Я просто получаю эту ошибку для app.use статических файлов: TypeError: Router.use () требует функции промежуточного программного обеспечения, но получил строку. Действительно ли это нужно app.use для таких статических файлов? У меня не было проблем с файлами css.

Albert Koholić 30.08.2018 10:52

Извините, я забыл использовать экспресс-статику

sachin 30.08.2018 12:00

Мне только что дал решение очень похожей задачи мой замечательный наставник. Форма входа «submit» была передана в jQuery («щелчок») и после аутентификации вызвала Res.Render результатов вызова API. Набор результатов вызова API был записан в журнал, но страница так и не была обработана, и ошибки не было. Он сказал мне, что jQuery действует как «теневой» DOM, и что Res.Render также находится в этом теневом DOM. Я изменил форму входа на форму Post вместо jQuery на Click.
Это СРАБОТАЛО! Я работал над этим несколько дней, даже не подозревая, что jQuery может вызвать такое препятствие.

Вы должны упомянуть макет

app.get('/', function (req, res) {
    res.render('index',{layout:false})
});

Другие вопросы по теме