Не удается прочитать свойство 'userName' из неопределенного при попытке визуализации нефрита шаблона - PullRequest
0 голосов
/ 16 ноября 2018

Самое странное. Я передаю значение в Jade 'переменную', и шаблон читает переменную, как вы можете видеть, как она выводится на консоль (см. «Это is1 ... это is2 и т. Д.») И отображается на экране. Однако страница, кажется, визуализируется во второй раз, и в этот момент шаблон потерял значение переменной -> смотрите «this is1» во втором случае.

Я не могу понять, почему страница отображается дважды. Кроме того, я говорю, что это странно, поскольку страница выглядит нормально, только когда я проверяю журнал, я вижу ошибки, и когда я пытаюсь сделать запрос на основе одного из идентификаторов объекта переменных, становится ясно, что шаблон думает значения (currentUser) varables не определены, есть мысли? Я потянул за это волосы. Спасибо:

ROUTE.js:

router.get('/setuser/:id',ctrlPages.setUser);

CONTROLLER.js:

var mongoose = require('mongoose');
var User = mongoose.model('User');
module.exports.setUser = (req, res) => {
 console.log('req param id', req.params.id);
 User.find({_id: ObjectId(req.params.id)}, { new: true }, (err, u 
userId) => {
        console.log('userid',userId);
            if (userId === null) { 
            console.log('error');
            res.redirect('/');
            } 
        else{
        console.log('user set');
        //currentUser = userId;
        res.redirect('/');
        }
    });
};

ШАБЛОН:

extends layout
include _includes/sharedHTMLfunctions
block content  
    .row.page-header
        .col-lg-8
            .row
                .col-xs-12.col-sm-6
                    .panel.panel-primary
                        .panel-heading
                            h2.panel-title Admin page
                        - console.log('this is3',currentUser)
                        .panel-body
                            .text-center
                                .jumbotron
                                    h4 This page is for managing users
                                    h4 You will be able to create, delete and change 
                                    h4 the current system user. As well as add content.
                                    h4 This will be entirely for black box testing and
                                    h4 will not be acessible once the site is live.

                                    h3 current user:
                                    h2 #{currentUser.userName}
                            h2 Current users in database:   
                            h3 this data is being supplied in real-time by the model         

                            each user in userList
                                span.h4 Username: 
                                span.h2= user.userName 
                                - console.log('this is4',user)
                                p(style='text-align:right')
                                    span.h4 Rating:
                                    span.h2= user.rating
                                    a(href="/setuser/#{user._id}")
                                        button(type="button") set as user



                .col-xs-12.col-md-6

                    h1 Add users
                    form.form-horizontal(action="/", method="post", role="form")
                        .form-group
                            label.col-xs-10.col-sm-2.control-label(for="userName") user name
                            .col-xs-12.col-sm-8
                                input#name.form-control(name="userName")
                        .form-group
                            label.col-xs-10.col-sm-2.control-label(for="rating") rating
                            .col-xs-12.col-sm-2
                                select#rating.form-control.input-sm(name="rating")
                                    option 10
                                    option 9
                                    option 8
                                    option 7
                                    option 6
                                    option 5
                                    option 4
                                    option 3
                                    option 2
                                    option 1
                        button.btn.btn-default.pull-right(href="") Add user

                    h1 Add forum posts to current user
                    form.form-horizontal(action="/", method="post", role="form")
                        .form-group
                            label.col-xs-10.col-sm-2.control-label(for="topic") post
                            .col-xs-12.col-sm-8
                                input#name.form-control(name="topic")


                        button.btn.btn-default.pull-right(href="") Add post

LAYOUT.jade

doctype html
html
  head
    meta(name='viewport', content='width=device-width, inital-scale=1.0')
    title= title
    link(rel='stylesheet', href='/bootstrap/css/bootstrap.css')
    link(rel='stylesheet', href='/bootstrap/css/style.css')
    link(rel='stylesheet', href='/bootstrap/css/forum.css')


  body
    navbar.navbar-defauly.navbar-fixed-top
      .container
        .navbar-header
          a.navbar-brand(href="/home") Create Together
          button.navbar-toggle(type="button", data-toggle="collapse", data-target="#navbar-main")
            span.icon-bar
            span.icon-bar
            span.icon-bar
        #navbar-main.navbar-collapse.collapse
          ul.nav.navbar-nav.navbar-right
            li
              a(href='/unitplans') Unit planners
            li
              a(href='/forum') Forum
            li
              a(href='/helpme') Help me
            li
              a.selected(href='/') (Admin)
    .col-lg-3
        .panel.panel-primary
                        .panel-heading
                            h2.panel-title User information

                        .panel-body
                            .text-center
                                img(src='/uploads/avatar.jpg', width='200',height=-'300')

                            span.h4 Username
                            center
                            - console.log('this is1',currentUser)
                               span.h2= currentUser.userName

                            h4 Users who recently liked your work
                                center
                                    li.span.h5 mathsGeek82
                                    li.span.h5 algIsBest76
                            h4 Other site related information
                            h4 Rating
                            center
                            - console.log('this is2',currentUser)
                               +ratingText(currentUser.rating)
    .container
      block content 
      footer
        .row
            .col-xs-12
              small footer            

script(src='/javascripts/jquery-3.3.1.js')
script(src='/bootstrap/js/bootstrap.min.js')

Журнал КОНСОЛИ

adminFire
this is1 { userName: 'no user selected', rating: '10' }
this is2 { userName: 'no user selected', rating: '10' }
this is3 { userName: 'no user selected', rating: '10' }
this is4 { _id: 5bee3c67194ff91a857ba7ed,
  userName: 'me',
  rating: 5,
  __v: 0 }
this is4 { _id: 5bee3e3953ae361b0f62d2a4,
  userName: 'stev',
  rating: 4,
  __v: 0 }
this is4 { _id: 5bee3e91067d181b2fba359a,
  userName: 'bollox',
  rating: 8,
  __v: 0 }
this is4 { _id: 5bee3eb0067d181b2fba359b,
  userName: 'nick',
  rating: 10,
  __v: 0 }
GET / 200 938.186 ms - 4563
GET /bootstrap/css/bootstrap.css 304 15.842 ms - -
GET /bootstrap/css/style.css 304 10.458 ms - -
GET /bootstrap/css/forum.css 304 2.209 ms - -
GET /uploads/avatar.jpg 304 1.848 ms - -
this is1 undefined
GET /javascripts/jquery-3.3.1.js 404 146.950 ms - 3749
TypeError: /Users/smyths1/Desktop/Assign2_restart/Assignment_2_clone_After_ASS2_Complete/app_server/views/layout.jade:43
    41|                             center
    42|                             - console.log('this is1',currentUser)
  > 43|                                span.h2 #{currentUser.userName}
    44|
    45|                             h4 Users who recently liked your work
    46|                                 center

EDIT: Спасибо Грэм, однако это не помогло. Я добавил оператор возврата:

Вот мой код res.render:

module.exports.admin = (req, res) => {
    // user find by id then set to active user?
    User.find((err, userList) => {
        console.log('adminFire');
        if (!err) {
            console.log('return adb4');
            res.render('locations-admin', {
                title: 'Create Together',
                userList: userList,            
                currentUser: activeUser
            });
            console.log('return adafter');
            return;
        }
        else {
            console.log('Error in retrieving user list :' + err);
        }
    });
};

Есть еще мысли?

РЕДАКТИРОВАТЬ 2: На самом деле проблема, похоже, заключается в кодовом блоке res.render. Я поиграл с этим, и кажется, что код запускает res.render один раз успешно (то есть с правильными отображаемыми переменными), но затем сразу же запускает его снова с неопределенными переменными.

Вот мой новый вывод консоли:

adminFire
return adb4
this is1 { userName: 'no user selected', rating: '10' }
this is2 { userName: 'no user selected', rating: '10' }
this is1 undefined
return adafter
GET / 500 2343.440 ms - 3747
TypeError: /Users/smyths1/Desktop/Assign2_restart/Assignment_2_clone_After_ASS2_Complete/app_server/views/layout.jade:42
    40|                             center
    41|                             - console.log('this is1',currentUser)
  > 42|                                span.h2= currentUser.userName
    43|
    44|                             h4 Users who recently liked your work
    45|                                 center

РЕДАКТИРОВАТЬ 3: ОК, сюжет утолщается ... Теперь я закомментировал ВСЕ мои маршруты, поэтому нет необходимости что-либо делать.

Однако программа все еще пытается отобразить «макет». Теперь я полностью потерян.

Вот мой файл app.js:

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

// for mongo
require('./app_api/models/db'); 


var indexRouter = require('./app_server/routes/index');
var routesApi = require('./app_api/routes/index');

var app = express();

// view engine setup
app.set('views', path.join(__dirname,'app_server','views'));
app.set('view engine', 'jade');
app.set('view options', { layout: false }); 

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static('public'));


app.use('/', indexRouter);
app.use('/api', routesApi);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

Последний журнал консоли:

this is1 undefined
GET / 404 1493.571 ms - 3747
TypeError: /Users/smyths1/Desktop/Assign2_restart/Assignment_2_clone_After_ASS2_Complete/app_server/views/layout.jade:42
    40|                             center
    41|                             - console.log('this is1',currentUser)
  > 42|                                span.h2= currentUser.userName
    43|

РЕДАКТИРОВАТЬ 4: Итак, я вижу, что файл макета вызывается res.render по умолчанию. Если я удаляю расширение макетов с моей домашней страницы, оно загружается без ошибок. Однако, если я тогда добавлю «расширяет макет», проблема возвращается. Похоже, что приложение отображает макет по умолчанию, затем, когда я пытаюсь отобразить домашнюю страницу, которая расширяет макет, оно пытается снова отобразить макет, и возвращается ошибка.

Я сейчас вырываю волосы.

РЕДАКТИРОВАТЬ 5 добавил layout.jade выше: Спасибо за помощь, Грэм, но я все еще не могу добраться куда-нибудь.

...