Самое странное. Я передаю значение в 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 выше:
Спасибо за помощь, Грэм, но я все еще не могу добраться куда-нибудь.