我的应用程序是用expressjs,handlebars,mongoose / mongodb编写的,我不知道如何在handlebars打印数组之前对数组进行排序。
app.js(入口点)
var debug = require('debug');
var express = require('express');
var fs = require('fs');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var exphbs = require('express-handlebars')
...
...
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.engine('hbs', exphbs({ extname: '.hbs', defaultLayout: 'layout' }));
app.set('view engine', 'hbs');
app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({
secret: 'gh jewellery',
resave: false,
saveUninitialized: false,
cookie: { secure: false }
}));
app.use(function (req, res, next) {
console.log('middleware was called');
res.locals.session = req.session;
req.session.LoggedIn = false;
next();
});
以上,我将会话声明为局部变量,因为我将在布局视图中使用它。简而言之,它由导航栏组成,该导航栏将包含通知图标,用户名图标和消息图标及其各自的数据。下面是layout.hbs
layout.hbs
<!doctype html>
<html lang="en">
<head>
...
<title></title>
</head>
<body>
<nav class="navbar navbar-expand navbar-light bg-light sticky-top">
<a class="navbar-brand" id="cus" href="/" style="font-size:12px;"></a>
{{#if session.loggedIn}}
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav ml-auto">
<li class="nav-item dropdown ">
<a class="nav-link" href="#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="far fa-bell fa-lg" style="color:darkblue;"></i><span class="label label-info"> {{session.user.notification.counter}}</span>
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink">
{{#each session.user.notification.notidata}}
<div class="dropdown-item" href="#">
<div>
<h6>{{data.heading}}</h6>
<small>{{data.para}}</small>
<small class="text-muted">{{notidate}}</small>
<a style="float:right; font-size:8px;" href="#" class="badge badge-secondary">Mark As Read</a>
</div>
</div>
<div class="dropdown-divider"></div>
{{/each}}
<form action="/logout" method="post">
<button class="btn btn-light btn-block logoutbutton" type="submit">View All Notifications</button>
</form>
</div>
</li>
<li class="nav-item dropdown ">
<a class="nav-link" href="#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="far fa-envelope fa-lg" style="color:darkblue;"></i><span class="label label-info"> {{session.user.message.counter}}</span>
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink">
<a class="dropdown-item" href="#">
<div>
<h6>Heading</h6>
<small>This is the paragramgh look pretty cool to me if you ask!</small>
</div>
</a>
<div class="dropdown-divider"></div>
<form action="/logout" method="post">
<button class="btn btn-light btn-block logoutbutton" type="submit">View All Messages</button>
</form>
</div>
</li>
<li class="nav-item dropdown ">
<a class="nav-link " href="#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-user-circle fa-lg" style="color:darkblue;"> {{session.user.username}}</i>
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink">
<a class="dropdown-item" href="/profile/{{session.user._id}}">Profile</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="/adreqform">Post an Order</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="/managereq">Manage Order Requests</a>
<div class="dropdown-divider"></div>
<form action="/logout" method="post">
<button class="btn btn-light btn-block logoutbutton" type="submit">Logout</button>
</form>
</div>
</li>
</ul>
{{/if}}
{{#unless session.loggedIn}}
<div class="navbar-text ml-auto">
Hello! <a href="/signup" style="color:darkblue">Sign up</a> or <a href="/login" style="color:darkblue">Login</a>
</div>
{{/unless}}
</div>
</nav>
<div class="container-fluid">
<div class="row">
<div class="col-md-2">
</div>
<div class="col-md-7">
{{{body}}}
</div>
<div class="col-md-3">
<div class="w-100 ">
<br />
<div class="card">
<div class="card-body">
<h5 class="card-title">Special title treatment</h5>
<hr>
<p class="card-text">With supporting text below as a natural lead-in to additional content.</p>
<a href="#" class="btn btn-primary">Go somewhere</a>
</div>
</div>
</div>
<div class="w-100">
<br />
<div class="card">
<div class="card-body">
<h5 class="card-title">Special title treatment</h5>
<hr>
<p class="card-text">With supporting text below as a natural lead-in to additional content.</p>
<a href="#" class="btn btn-primary">Go somewhere</a>
</div>
</div>
</div>
</div>
</div>
</div>
<!--<script>
$(document).ready(function () {
$(".dropdown-toggle").dropdown();
});
</script>-->
</body>
</html>
user.models.js(猫鼬模型)
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
username: String,
email: String,
password: String,
company: String,
contact: Number,
country: String,
isLoggedIn: Boolean,
createdOn: { type: Date, default: Date.now },
ads: [{ type: Schema.Types.ObjectId, ref: 'Ad' }],
notification: {
counter: Number,
notidata: [{
notiId: Schema.Types.ObjectId,
notidate: { type: Date, default: Date.now },
data: {
heading: String,
para: String
},
notistatus: {type: Boolean, default: false}
}]
}
});
var User = module.exports = mongoose.model('User', UserSchema);
myroute.js(足以解释我遇到的问题的部分代码)
var user3 = {
username: req.body.username,
email: req.body.email,
password: req.body.password,
country: req.body.country
};
var newuser = new User(user3);
newuser.save(function (err, newuser) {
if (err) {
console.log(err);
}
req.session.user = newuser;
req.session.loggedIn = true;
req.session.save();
以上关于如何通过
将req.session.user
分配给当前用户的通知
req.session.user = newuser;
现在我遇到的问题是,因为 layout.hbs 并没有在我第一次打开localhost:3000
我可以对notidata
数组进行排序。基本上,所有user
文档都包含notidata
数组中的通知数据,并在#each
的帮助下以 layout.hbs 打印帮手。 我希望notidata
按日期排序然后打印出来,但是由于没有找到任何路线,因此我不知道在哪里可以做类似{{1} }甚至可能还没有做到这一点?是session.user打印User.find().sort(notidate: 'desc')...
,我很迷茫。
由于notidata
是在 layout.hbs 中打印session.user
的内容,因此如何在查看之前对其进行排序?我读过某个地方,可以在前端使用自定义车把助手,该助手首先进行排序,然后对notidata
进行迭代,但是我想在后端对其进行排序,然后将其带入视图。
答案 0 :(得分:0)
创建新用户并保存时,它将返回您的用户对象。这样您就可以获取它,并以任意顺序对其进行操作或更改:
newuser.save(function (err, newuser) {
if (err) {
console.log(err);
}
//here before returning the whole user object you can sort it:
const notidata = newUser.notification.notidata;
const sortedNotiData = notidata.sort(function(a,b){
return new Date(a.notidate) - new Date(b.notidate);
})
// now sortedNotiDate contain sorted data so:
newuser.nottification.notidata = sortedNotiData;
req.session.user = newuser;
req.session.loggedIn = true;
req.session.save();