# node-angular-mongodb-Web
a web demoSite use node-angular-mongodb
本项目中包括整个Nodejs、Mongodb、AngularJs栈的实例,该实例显示了如何从你的网站添加、修改和删除用户。
##1.准备阶段
###1.1用到的库
>* express:作为项目的主Web服务器
>* ejs:用于呈现HTML模板
>* mongodb:用于访问MongoDB数据库
>* mongoose:用于提供结构化的数据模型
>* connect-mongo:提供Express和MongoDB之间的联系,让你可以使用MongoDB作为会话的持久性存储
>* AngularJs库
###1.2项目的目录结构
![这里写图片描述](http://img.blog.csdn.net/20161007201900629)
---
##2.将用户添加到网站
###2.1定义用户模型
```
var mongoose=require.resolve('mongoose');
var Schema=mongoose.Schema;
var UserSchema=new Schema({
username:{type:String,unique:true},
email:String,
color:String,
hashed_password:String
});
mongoose.model('User',UserSchema);
```
以上,定义的用户模型实现了一个唯一的username以及email、color、hashed_password字段,最后在Mongoose中创建此模型。
###2.2创建服务器
```
//auth_server.js
var express=require('express');
var bodyParser=require('body-parser');
var cookieParser=require('cookie-parser');
var expressSession=require('express-session');
var mongoStore=require('connect-mongo')(expressSession);
var mongoose=require('mongoose');
require('./models/users_model.js');
var dbUrl='mongodb://localhost:27017/myapp';
var conn=mongoose.connect(dbUrl);
var app=express();
app.engine('.html',require('ejs').__express);
app.set('views','./views');
app.set('view engine','html');
app.use(bodyParser.urlencoded({extended:false}));
app.use(cookieParser());
app.use(expressSession({
// 假设每次登陆,就算会话存在也重新保存一次,默认true
resave:false,
// 强制保存未初始化的会话到存储器,默认true
saveUninitialized:true,
secret:'SECRET',
cookie:{maxAge:60*60*1000},
store:new mongoStore({
url:dbUrl,
//指定持久化到mongodb数据库中的collections的名字
collection:'sessions'
})
}));
require('./routes.js')(app);
app.listen(3000);
```
###2.3实现路由
该文件实现必要的路由来支持注册、登录、编辑和删除用户,同时支持加载静态文件的静态路由。
```
//routes.js
var crypto=require('crypto');
var express=require('express');
module.exports=function(app){
var users=require('./controllers/users_controllers');
app.use('/static',express.static('./static'))
.use('/lib',express.static('./lib'));
//主页路由,检测是否登录
app.get('/',function(req.res){
if(req.session.user){
res.render('index',{username:req.session.username,msg:req.session.msg});
}else{
req.session.msg='Access denied!';
res.redirect('/login');
}
});
//user路由
app.get('/user',function(req,res){
if(req.session.user){
res.render('user',{msg:req.session.msg});
}else{
req.session.msg='Access denied!';
res.redirect('/login');
}
});
//注册路由,get请求
app.get('/signup',function(req,res){
if(req.session.user){
res.redirect('/');
}
res.render('signup',{msg:req.session.msg});
});
//登录
app.get('/login',function(req,res){
if(req.session.user){
res.redirect('/');
}
res.render('login',{msg:req.session.msg});
});
//退出登录
app.get('/logout',function(req,res){
//退出前销毁当前会话
req.session.destroy(function(err){
if(err){
console.log(err);
}
res.redirect('/login');
});
});
//注册路由,post请求
app.post('/signup',users.signup);
app.post('/user/update',users.updateUser);
app.post('/user/delete',users.deleteUser);
app.post('/login',users.login);
app.get('/user/profile',users.getUserProfile);
}
```
###2.4实现用户控制器路由
(1)用户注册路由
此路由首先创建一个新的User对象,然后添加电子邮件地址,并添加使用在同一个文件中定义的hashPW()函数三列后密码,实现对密码的加密,之后在对象上调用Mongoose save()方法,将其存储在数据库中。
出现错误时,重定向到注册页面。
如果用户成功注册保存,由MongoDB创建的ID被添加为`req.session.user`属性,用户名被添加为`req.session.username`,该请求被定向到索引页。
(2)用户登录路由
此路由通过用户名查找到用户,然后比对密码,如果密码正确,则使用`regenerate()`方法再次生成用户会话,注意设置`req.session.user` 和 `req.session.username`
(3)获得用户配置文件的路由
此路由利用存储在`req.session.user`中的用户ID查找用户,如果找到,则在请求中返回用户对象的 `JSON`表示,如果没有找到,发送404错误
(4)用户更新路由
此路由根据用户ID在数据库中查找到用户,接着根据 `POST`过来的请求更新`email`和`color`,并且调用`save()`保存到数据库 ,最后重定向到 `/user`以显示更改后的结果。
(5)用户删除路由
此路由根据用户ID查找数据库中的用户,调用`remove()`方法删除和用户,需要注意的是,因为用户不再存在,所以最后要调用`req.session.destroy()`来删除会话。
```
//users_controllers.js
var crypto=require('crypto');
var mongoose=require('mongoose');
var User=mongoose.model('User');
function hashPW(pwd){
//hash.update(data, [input_encoding]):通过提供的数据更新哈希对象,可以通过input_encoding指定编码为'utf8'、'ascii'或者 'binary'。
//如果没有指定编码,将作为二进制数据(buffer)处理。
//hash.digest([encoding]):计算传入的所有数据的摘要值。encoding可以是'hex'、'binary'或者'base64',如果没有指定,会返回一个buffer对象。
return crypto.createHash('sha256').update(pwd).digest('base64').toString();
}
//注册
exports.signup=function(req,res){
var user=new User({username:req.body.username});
user.set('hashed_password',hashPW(req.body.password));
user.set('email',req.body.email);
user.save(function(err){
if(err){
res.session.error=err;
res.redirect('./signup');
}else{
req.session.user=user.id;
req.session.username=user.username;
req.session.msg='Authenticated as '+user.username;
res.redirect('/');
}
})
}
//登录
exports.login=function(req,res){
User.findOne({username:req.body.username})
.exec(function(err,user){
//用户不存在
if(!user){
err='User Not Found.';
}else if(user.hashed_password===hashPW(req.body.password.toString())){
// 重新生成一个新的session
req.session.regenerate(function(){
req.session.user=user.id;
req.session.username=user.username;
req.session.msg='Authenticated as '+user.username;
res.redirect('/');
});
}else{
err='Authenticated failed.'
}
if(err){
req.session.regenerate(function(){
req.session.msg=err;
res.redirect('./login');
});
}
});
};
// /将用户信息以json格式返回
exports.getUserProfile=function(req,res){
User.findOne({_id:req.session.user})
.exec(function(err,user){
if(!user){
res.json(404,{err:'User Not Found.'});
}else{
res.json(user);
}
});
};
//更新用�
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Nodejs+Angular+Mongodb-Web-Demo(1).7z (14个子文件)
models
users_model.js 227B
package.json 632B
routes.js 2KB
controllers
users_controllers.js 3KB
static
css
bootstrap.min.css 118KB
styles.css 131B
js
my_app.js 384B
angular.min.js 156KB
views
login.html 1KB
index.html 779B
signup.html 1KB
user.html 2KB
auth_server.js 1021B
lib
README.md 17KB
共 14 条
- 1
资源评论
- play82020-01-27一个简单的登陆实例,可以用来做demo
Quiet-Night
- 粉丝: 156
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功