使用云代码的 web hosting 功能,你可以在我们的云代码里托管一个网站。网站很经常需要处理的一个事情是用户登录和登出。
今天我们来介绍下怎么在云代码里的web主机里,使用express.js框架处理用户登录和登出。
首先,您需要安装最新版本的avoscloud-code命令行工具(必须升级到最新的 0.3.3-beta
版本):
sudo npm install -g avoscloud-code
关于命令行更多详细内容请参考这篇博客。
接下来,假设你创建了一个支持web主机功能的云代码项目,在 app.js
里添加下列代码:
var express = require('express');
var app = express();
var avosExpressCookieSession = require('avos-express-cookie-session');
// App全局配置
app.set('views', 'cloud/views'); //设置模板目录
app.set('view engine', 'ejs'); // 设置template引擎
app.use(express.bodyParser()); // 读取请求body的中间件
//启用cookie
app.use(express.cookieParser('Your Cookie Secure'));
//使用avos-express-cookie-session记录登录信息到cookie。
app.use(avosExpressCookieSession({ cookie: { maxAge: 3600000 }}));
使用 express.cookieParser
中间件启用cookie,注意传入一个secret用于cookie加密(必须)。然后使用 require('avos-express-cookie-session')
导入的 avosExpressCookieSession
创建一个session存储,它会自动将AV.User的登录信息记录到cookie里,用户每次访问会自动检查用户是否已经登录,如果已经登录,可以通过 AV.User.current()
获取当前登录用户。
avos-express-cookie-session'
支持的选项包括:
AV.User.current()
当前用户的 id
属性,您可以在必要的时候fetch整个用户。通常保持默认的false就可以。avos.sess
。登录很简单:
app.get('/login', function(req, res) {
// 渲染登录页面
res.render('login.ejs');
});
// 点击登录页面的提交将出发下列函数
app.post('/login';, function(req, res) {
AV.User.logIn(req.body.username, req.body.password).then(function() {
//登录成功,avosExpressCookieSession会自动将登录用户信息存储到cookie
//跳转到profile页面。
console.log('signed in successfully: %j', AV.User.current());
res.redirect('/profile');
},function(error) {
//登录失败,跳转到登录页面
res.redirect('/login');
});
});
//查看用户profile信息
app.get('/profile', function(req, res) {
// 判断用户是否已经登录
if (AV.User.current()) {
// 如果已经登录,发送当前登录用户信息。
res.send(AV.User.current());
} else {
// 没有登录,跳转到登录页面。
res.redirect('/login');
}
});
//调用此url来登出帐号
app.get('/logout', function(req, res) {
//avosExpressCookieSession 将自动清除登录cookie信息
AV.User.logOut();
res.redirect('/profile');
});
登录页面大概是这样 login.ejs
:
Username
Password
P.S. 本次除了命令行工具做了升级之外,我们的avoscloud-sdk也升级到了 0.2.8
,解决在node.js环境下用户登录信息会保存在本地文件的Bug。
注意:express框架的 express.session.MemoryStore
在我们云代码中是无法正常工作的,因为我们的云代码是多主机,多进程运行,因此内存型session是无法共享的,建议用cookieSession中间件。