要先安装 npm install mongoose -S 。安装之后在项目中引入并连接到数据库 userdb
var mongoose = require('mongoose');
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost:27017/userdb', {useMongoClient: true});
连接成功之后,定义一个 Schema,它一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力。
var userSchema = new mongoose.Schema({
username: String,
email: String
})
这里的 userSchema 还不能对数据库进行操作,只是定义了数据模型属性 username, email 为字符串类型。需要将该 Schema 发布为 Model,Model 是由 Schema 发布生成的模型,具有抽象属性和行为的数据库操作对。
var model = mongoose.model('user', userSchema);
最后 model 就可以对数据库进行操作了,把上面的代码封装成 userModel.js 到根目录下新建一个 models/ 目录下面,用 module.exports = model; 将 model 暴露出来供其他文件使用。
在 user.js 路由文件里,我们来引入 userModel.js 进行数据库操作。
var userModel = require('../models/userModel.js');
router.get('/list', function(req, res, next) {
userModel.find(function(err, data){
if(err){ return console.log(err) }
res.render('UserList',{
user: data
})
})
});
这里使用 userModel.find() 查询到所有用户。但是现在数据库里还是空的,我们来新增一个添加用户页面向数据库里插入数据。
添加用户
在 views/ 目录下新建 UserAdd.html 添加用户视图
<!DOCTYPE html>
<html>
<head>
<title>用户编辑页面</title>
</head>
<body>
<form action="/users/add" method="post">
<input type="text" name="username" value="">
<input type="email" name="email" value="">
<button type="submit">submit</button>
</form>
</body>
</html>
在 user.js 路由文件里来添加对应视图的路由
router.get('/add', function(req, res, next) {
res.render('UserAdd');
});
这是渲染视图页面的路由,我们需要添加一个 post 方法的路由,在点击提交按钮的时候,把数据存进数据库里。
router.post('/add', function(req, res, next) {
var newUser = new userModel({
username: req.body.username,
email: req.body.email
})
newUser.save(function(err, data){
if(err){ return console.log(err) }
res.redirect('/users/list');
})
});
这里使用 new userModel() 创建了一个 Entity,它是由 Model 创建的实体,它的操作也会影响数据库。newUser 调用 save() 方法将数据保存到数据库中。然后 res.redirect() 将页面重定向到用户列表页面,这时就可以看到我们新增的用户显示在列表中了。接下来我们看看如何来编辑用户信息。
编辑用户
依然是创建相应的用户编辑视图:UserEdit.html
<!DOCTYPE html>
<html>
<head>
<title>用户编辑页面</title>
</head>
<body>
<form action="/users/update" method="post">
<input type="hidden" name="id" value="<%= user._id %>">
<input type="text" name="username" value="<%= user.username %>">
<input type="email" name="email" value="<%= user.email %>">
<button type="submit">update</button>
</form>
</body>
</html>
添加对应的路由:/users/edit/:id 来渲染视图,/users/update 来修改数据库数据
router.get('/edit/:id', function (req, res, next) {
var id = req.params.id;
userModel.findOne({_id: id}, function (err, data) {
res.render('UserEdit', {
user: data
})
})
});
router.post('/update', function (req, res, next) {
var id = req.body.id;
userModel.findById(id, function (err, data) {
if(err){ return console.log(err); }
data.username = req.body.username;
data.email = req.body.email;
data.save(function(err){
res.redirect('/users/list');
})
})
});
userModel.findOne() 会根据查询条件 {_id: id} 查询到对应的一