• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Strona główna aplikacji ejs nie aktualizuje się natomiast wszystkie inne podstrony działają poprawnie.

Object Storage Arubacloud
0 głosów
229 wizyt
pytanie zadane 26 stycznia 2021 w JavaScript przez Piotr Kułakowski Początkujący (390 p.)
zamknięte 27 stycznia 2021 przez ScriptyChris

Cześć,

W mojej aplikacji nodejs z silnikiem widoków ejs główna strona nie aktualizuje się natomiast wszystkie inne podstrony działają poprawnie. Mam te błąd już od kilku dni i nie wiem co zrobić. W każdej przeglądarce działa to tak samo. Wszędzie czyściłem ciasteczka i cache, ale nic nawet w samej aplikacji do dałem metodę ejs.clearCache() i dalej nie działa.

tutaj umieszczam kod z app.js, index.js i server.js  :

const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const flash = require('connect-flash');
const session = require('express-session');
const routes = require('./routes/index');
const errorControllers = require('./controllers/ErrorControllers');
const sanitizer = require('sanitize').middleware;
const ejs = require('ejs');

const app = express();

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.static(path.join(__dirname, 'public')));

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());

app.use(session({
    secret: 'sendEmail',
    resave: true,
    saveUninitialized: true,
    cookie: {}
}));

app.use(flash());

app.use('/', routes);

app.use(sanitizer);
app.use(errorControllers.notFound);
app.use(errorControllers.catchErrors);

ejs.clearCache();

module.exports = app;
const express = require('express');
const router = express.Router();

const PagesControllers = require('../controllers/PagesControllers');
const ApplicationController = require('../controllers/ApplicationController');
const { catchAsync } = require('../controllers/ErrorControllers');

router.get('/', PagesControllers.home);

// subpages
router.get('/subpages/portfolio.html', PagesControllers.po...);

router.get('/subpages/reviews.html', PagesControllers.rev...);

router.get('/subpages/web-pages.html', PagesControllers.we...);

router.get('/subpages/ux-design.html', PagesControllers.ux...);

router.get('/subpages/seo.html', PagesControllers.s...);

router.get('/subpages/online-shops.html', PagesControllers.on...);

router.get('/subpages/landing-page.html', PagesControllers.la...);

router.post('/src/account.js',
    ApplicationController.sanitize,
    ApplicationController.validate,
    ApplicationController.checkValidation,
    catchAsync(ApplicationController.store)
);

module.exports = router;
const app = require('./app');

app.set('port', 3000);

const server = app.listen(app.get('port'));
exports.home = (req, res) => {
    res.render('home', {
        formMessage: req.flash('form'),
        title: '',
        description: '',
        prefix: '',
    });
};

Jak by było jeszcze coś potrzebne to piszczie.

I z góry dziękuję.

komentarz zamknięcia: Rozwiązaniem problemu było poprawienie struktury plików - opisane w komentarzu.
komentarz 26 stycznia 2021 przez ScriptyChris Mędrzec (190,190 p.)

W mojej aplikacji nodejs z silnikiem widoków ejs główna strona nie aktualizuje się natomiast wszystkie inne podstrony działają poprawnie.

Masz na myśli, że strona główna nie wyświetla zmian, które wprowadzasz w jej kodzie? Czy ten kod zmieniasz bezpośrednio na serwerze, czy masz jakiś proces budujący apkę po dokonaniu zmian w kodzie? Próbowałeś tę stronę otworzyć w oknie incognito/prywatnym przeglądarki?

komentarz 26 stycznia 2021 przez Piotr Kułakowski Początkujący (390 p.)
Tak, Próbowałem. Stronę póki co robię na localhostcie I póki co nie wrzucałem jej na serwer. Główna strona niechce wczytać zmian w kodzie, a wszystkie inne podstrony działają dobrze
komentarz 26 stycznia 2021 przez ScriptyChris Mędrzec (190,190 p.)

A gdy do callbacka obsługującego route tej strony głównej wstawisz console.log z treścią response'a, która jest odsyłana do frontendu, to co się pokazuje w konsoli Node'a - kod HTML po zmianach, czy tutaj też go nie aktualizuje?

komentarz 26 stycznia 2021 przez Piotr Kułakowski Początkujący (390 p.)
przywrócone 26 stycznia 2021 przez Piotr Kułakowski
To o czym teraz mówisz to nie wiem bo mnie teraz w domu nie ma, ale jak np. zrobiłem funkcję wysyłania e-maili na tej stronie i jak ktoś poda złe dane to renderuje się ta sama strona tylko że pod innym URL to wtedy jest ona normalnie zaktualizowana.
komentarz 26 stycznia 2021 przez Piotr Kułakowski Początkujący (390 p.)
edycja 26 stycznia 2021 przez Piotr Kułakowski

Jak zrobię tak jak ty mówiłeś, to nic mi nie wyświetla. Tak jak bym nie zrobił tego console.log

a zrobiłem to w ten sposób:

exports.home = (req, res, callback) => {
    res.render('home', {
        formMessage: req.flash('form'),
        title: '',
        description: '',
        prefix: '',
    });

    callback(console.log(res));
};

jednak jak coś takie go zrobie przy renderowaniu jakiej kolwiek podstrony to wyświetla mi całego json - a response.

komentarz 26 stycznia 2021 przez ScriptyChris Mędrzec (190,190 p.)

Yyy, jeśli ta funkcja jest przekazywana jako middleware do express'a, to argument callback jest funkcją next, a jej wywołanie z parametrem innym niż string "route" traktowane jest jako wskazanie, że wystąpił błąd. Natomiast samo wywołanie next przekazuje kontrolę do następnego middleware - czemu więc przekazałeś mu wartość undefined (to jest wartość zwracana przez console.log)?

Wyświetlenie obiektu res raczej bezpośrednio nie wskaże contentu wysłanego do klienta. Spróbuj przekazać do res.render callback i tam powinieneś w parametrze otrzymać wyrenderowany content.

komentarz 26 stycznia 2021 przez Piotr Kułakowski Początkujący (390 p.)
edycja 26 stycznia 2021 przez Piotr Kułakowski

console.log(res.render(home, {})) też już robiłem i nic mi się nie wyświetlało dlatego później wyszło mi coś takiego jak kombinowałem.A jak to robiłem na pod stronach to wyświetlało mi się undefined.

exports.home = (req, res) => {

    console.log(res.render('home', {
        formMessage: req.flash('form'),
        title: '',
        description: '',
        prefix: '',
    }));


};

 

komentarz 26 stycznia 2021 przez ScriptyChris Mędrzec (190,190 p.)

Wstaw console.log do callbacka (na podstawie przykładu z dokumentacji podlinkowanej wyżej):

res.render('home', {
      formMessage: req.flash('form'),
      title: '',
      description: '',
      prefix: '',
  }, function (err, html) {
    console.log('html', html);

    res.send(html); // wg docsów trzeba to wywołać, żeby wysłać content do klienta, gdy korzysta się z callbacka
  }
)
komentarz 26 stycznia 2021 przez Piotr Kułakowski Początkujący (390 p.)

Właśnie zrobiłem tak jak pokazałeś i przy renderowaniu home ponownie nic się nie wyświetliło, natomiast przy renderowaniu jednej z podstron pokazał się jej cały wyrenderowany kod html.

exports.home = (req, res) => {

    res.render('home', {
        formMessage: req.flash('form'),
        title: '',
        description: '',
        prefix: '',
    },function(err, html) {
      console.log('html', html);

      res.send(html);
    });
};

 

komentarz 26 stycznia 2021 przez ScriptyChris Mędrzec (190,190 p.)

 przy renderowaniu home ponownie nic się nie wyświetliło

Nic w sensie nawet napis 'html' z pierwszego parametru console.log? Dodaj jeszcze pokazywanie parametru err (może po drodze występuje jakiś błąd):

    },function(err, html) {
      console.log('html', html, ' /err:', err); // <- dodaj logowanie err
 
      res.send(html);
    });

A czy w ogóle res.render wywołuje się, gdy wchodzisz na główną stronę? Wstaw jeszcze console.log('home endpoint') przed res.render - jeśli to się nie wyświetli w konsoli, to najwyraźniej route dla głównej strony nie jest prawidłowo spięty z tą funkcja.

komentarz 26 stycznia 2021 przez Piotr Kułakowski Początkujący (390 p.)
edycja 26 stycznia 2021 przez Piotr Kułakowski

Przy renderowaniu głównej ponownie nic mi nie wyświetla (kompletnie nic) natomiast jak to robię na podstronie to normalny kod html i /err: null. Jeśli chodzi o ten console.log('/') przed res.render to on też się nie wywołuje i nic nie wyświetla. Cała funkcja jakby nie działała to znaczy była źle podpięta tak jak mówisz, ale gdy w chodzę do pliku gdzie mam to podłączone do routes o w ten sposób:

router.get('/', PagesControllers.home);

i klika na PagesControllers.home trzymając ctrl w visual studio code (u ciebie będzie to commend jeśli masz MacOS) i przekierowuje mnie właśnie do tej funkcji.

komentarz 26 stycznia 2021 przez ScriptyChris Mędrzec (190,190 p.)

W app.js masz taki zapis:

app.use('/', routes);

Wg docsów jako drugi parametr do app.use powinna być przekazana funkcja middleware (jedna lub wiele, po przecinku lub jako tablica lub kombinacja tychże)*, a u Ciebie to jest (jeśli dobrze patrzę) obiekt router wyeksportowany z modułu routes/index? Czy express nie rzuca jakimś błędem na starcie apki? Czy jeśli usuniesz wspomnianą linijkę, to apka działa tak samo? Ogólnie, route'y konfigurujesz w pliku index.js i podpinasz wspomnianą linijką w pliku app.js?

* patrząc w kod źródłowy express'a, jest tam dodany komentarz, że jest dodana obsługa przypadku, gdy przekazana funkcja jest apką express'a. Więc może przekazanie router'a jest jakoś obsługiwane i całość działa - nie mam pewności, trzeba by debugować kod.

komentarz 26 stycznia 2021 przez Piotr Kułakowski Początkujący (390 p.)

Tak w app.js mam

app.use('/',routes)

Cały kod app.js, index.js i server.js umieściłem w pierwszym poście na samej górze jak chcesz zobaczyć. A jeśli chodzi o funkcje middleware to wiem o tym, że w stawia je się jako drugi paramter, ale poprostu tutaj żadnej nie potrzebowałem więc jej nie wstawiłem. Przy renderowaniu innych podstron to normalnie działa więc tu zrobiłem tak samo.

komentarz 26 stycznia 2021 przez ScriptyChris Mędrzec (190,190 p.)

Przy renderowaniu innych podstron to normalnie działa więc tu zrobiłem tak samo.

To całego routingu podstron nie masz skonfigurowanego w pliku index.js? (fragment z tego modułu)

// subpages
router.get('/subpages/portfolio.html', PagesControllers.po...);

(swoją drogą te trzy kropki na końcu drugiego parametru to powinien być błąd składniowy)

Jeśli "tu zrobiłem tak samo" oznacza, że jeszcze w innym miejscu masz konfiguracje routów, to czy ona jest również podpięta pod route '/'?

W każdym razie, wg mnie błąd leży bardziej po stronie (konfiguracji) express'a niż cache'a przeglądarki, bo przy nawigowaniu do strony głównej nie wywołuje funkcji home będącej middlewarem. A czy w przeglądarce pokazuje się cokolwiek, jakiś błąd, pusta strona? Bo napisałeś, że nie są widoczne aktualizacje - czyli co konkretnie się pokazuje?

1
komentarz 26 stycznia 2021 przez Piotr Kułakowski Początkujący (390 p.)
Jeśli chodzi o te trzy kropki to po prostu nie dokończyłem nazwy funkcji ponieważ była ona związana z ty o czym ma być strona i nie chciałem wszystkiego pokazywać
komentarz 26 stycznia 2021 przez Piotr Kułakowski Początkujący (390 p.)

Jeśli chodzi o konfigurację route to mam to zrobione w tym index.js który jest w pierwszym poście i mam go zaimportowanego do app.js i tam użytą funkcję 

app.use('/', routes)

 

komentarz 26 stycznia 2021 przez Piotr Kułakowski Początkujący (390 p.)
W przeglądarce pokazuje mi się strona z pierwszego w czytania strony głównej, a w konsoli nie wyskakuje żaden błąd. To jest aplikacja którą po jakimś czasie robienia po prostu przeniosłem do node i od czasu przeniesienia jej do node i zmienienia plików HTML na ejs oraz podzielenia ich na komponenty ta główna strona w ogóle się nie aktualizuję widzę kod z pierwszego wczytania strony po przeniesieniu jej do node.
komentarz 27 stycznia 2021 przez ScriptyChris Mędrzec (190,190 p.)
Trudno mi stwierdzić co jest przyczyną problemu patrząc na sam kod - przydało by się móc go przetestować z użyciem debuggera. Tutaj pomocne by było jakbyś upublicznił demo, na którym można odtworzyć ten problem. Nie musisz w nim udostępniać ficzerów biznesowych ani docelowej treści stron - wystarczy minimalistyczny kod, który po uruchomieniu pozwoli zreprodukować problem.
1
komentarz 27 stycznia 2021 przez Piotr Kułakowski Początkujący (390 p.)
Dobra już naprawiłem błąd i serdecznie dziękuję za poświęcony czas.

Zacząłem grzebać w plikach i folderach całej strony i po dłuższym czasie zauważyłem, że przy przenoszeniu tej strony jej do node, kiedy całą zwartość strony dałem do folderu public, a następnie usunąłem z tamtąd folder z podstronami to przez to, że index.html był poza tym folderem nie usunąłem go. Teraz już po usunięciu index.html z public wszystko działa tak jak powinno.

Jeszcze raz Dziękuję za poświęcony czas
komentarz 27 stycznia 2021 przez ScriptyChris Mędrzec (190,190 p.)
Mhmm, czyli to nie była wina ani cache przeglądarki ani express'a (chyba, że w jego konfiguracji można zrobić obejście dla takiej sytuacji), lecz struktury plików. Fajnie, że się udało. :)

Podobne pytania

0 głosów
0 odpowiedzi 87 wizyt
pytanie zadane 6 listopada 2022 w JavaScript przez Mefyra Nowicjusz (190 p.)
0 głosów
0 odpowiedzi 212 wizyt
0 głosów
1 odpowiedź 304 wizyt
pytanie zadane 27 sierpnia 2020 w JavaScript przez boneoflive Użytkownik (930 p.)

92,626 zapytań

141,486 odpowiedzi

319,844 komentarzy

62,009 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...