从零学习node.js之利用express搭建简易论坛(七)

2020-06-17 06:42:22易采站长站整理


$npm install express-session --save-dev

然后在app.js中引用:


var session = require('express-session')

app.use(session({
secret: 'wenzi', // 建议使用 128 个字符的随机字符串
cookie: { maxAge: 60*60*1000 }, // 设置时间
resave : false,
saveUninitialized : true
}));

设置完成后,就可以使用session保存数据了。以登录成功后保存数据为例:


user_m.login(username, password_hash, function(result){
if(result.length){
// 将数据保存到名为user的session中
req.session.user = {
uid : result[0].id,
username : username
}
res.redirect('/');
}else{
// console.log('登录失败');
res.render('login', {errmsg:'用户名或密码错误'});
}
});

还有一个问题:如何把session中的数据传递给模板呢,比如没有登录时,显示“注册,登录”连接,登录后显示“用户名,登录”信息。

在app.js中添加:


app.use(function(req, res, next){
// 如果session中存在,则说明已经登录
if( req.session.user ){
res.locals.user = {
uid : req.session.user.uid,
username : req.session.user.username
}
}else{
res.locals.user = {};
}
next();
})

然后在模板中就可以使用user变量了:


<% if(user.uid){ %>
<!-- 登录状态下 -->

<% }else{ %>
<!-- 非登录状态下 -->

<% } %>

四、首页及详情页

我们在首页能够展示主题列表并能发表主题,点击链接进入详情页后能该主题进行回复。当然发表主题和对主题进行回复都是在已经登录的状态进行的。

4.1 首页

在models目录创建list.js,从数据库中获取主题列表:


// models/list.js

var pool = require('./db');

module.exports = {
// 获取首页的主题
getIndexList : function(cb){
pool.getConnection(function(err, connection){
if(err) throw err;

// 连表查询,获取到作者的用户名
connection.query('SELECT `list`.*, username FROM `list`, `user` WHERE `list`.`uid`=`user`.`id`', function(err, result){
if(err) throw err;

cb(result);
connection.release();
// 接下来connection已经无法使用,它已经被返回到连接池中
})
});
}
}

在routes中的index.js中调用getIndexList获取数据,并调用index.ejs模板:


// routes/index.js

var list_m = require('../models/list');

router.get('/', function(req, res, next) {