准备:安装Node.js,mongodb,mongoose,webstorm
这里我采用的是mongoose来处理的。Mongoose是MongoDB的一个对象模型工具,可以工作于异步环境下。具体学习内容参看官网http:///docs/index.html
1、开始运用mongoose时,得先安装,打开命令行,执行$ npm install mongoose
2、连接mongodb数据库,在app.js里面添加如下两行代码。
- var mongoose = require('mongoose');
- mongoose.connect('mongodb://localhost/test'); //连接到一个test的数据库
操作到这里基本上是个人都会,不过接下来具体如何进行数据库的操作,在没有实例的情况下还是有点纠结的。我这里以一个登录注册为例来说明如何使用。
3、用webstorm创建一个新的Express App项目,这样就直接封装好了express(),省去了自己写的麻烦。然后修改app.js如下:
-
-
-
-
- var express = require('express')
- , routes = require('./routes')
- , user = require('./routes/user')
- , http = require('http')
- , path = require('path')
- , mongoose = require('mongoose');
-
-
- var app = express();
-
-
-
- app.set('port', process.env.PORT || 3000);
- app.set('views', __dirname + '/views');
- app.set('view engine', 'ejs');
- app.use(express.favicon());
- app.use(express.logger('dev'));
- app.use(express.bodyParser());
- app.use(express.methodOverride());
- app.use(app.router);
- app.use(express.static(path.join(__dirname, 'public')));
-
-
-
- if ('development' == app.get('env')) {
- app.use(express.errorHandler());
- }
-
-
- app.get('/', routes.index);
- app.get('/log',routes.login);
- app.post('/log',routes.doLogin);
- app.get('/reg',routes.reg);
- app.post('/reg',routes.doReg);
-
-
-
- mongoose.connect('mongodb://localhost/test_db'); //2
-
-
- http.createServer(app).listen(app.get('port'), function(){
- console.log('Express server listening on port ' + app.get('port'));
- });
4、接下来定义一下Schema和Model,这些就是数据库表的结构。在项目根路径下创建一个models的文件夹,里面添加一个user.js用来定义用户表。models/user.js代码如下。
- var mongoose = require('mongoose')
- , Schema = mongoose.Schema
- , ObjectId = Schema.ObjectId;
-
- var UserSchema = new Schema({
- name: String
- , password: String
- });
-
- module.exports = mongoose.model('User', UserSchema);
注意最后一行,这里是直接把UserSchema的Model给导出去了,也可以直接导出UserSchema,module.exports = UserSchema,不过这样做的话,再用这个表信息的时候就得单独Model一下。
5、引入mongoose后,自己添加相应的文件,在view里新建登录注册页,头部底部这些包含文件也都自己建。先说注册页,表单处理路径为/reg。注意用户名密码的输入框我是直接用name="user[]"这种形式,这样后面可以直接通过这个user来获取相关信息,其实不这样也可以。
- <% include header.ejs %>
- <form action="/reg" method="post">
- <input type="text" name="user[name]" />
- <input type="password" name="user[password]" />
- <input type="submit" value="Register" />
- </form>
- <% include footer.ejs %>
接下来修改doReg方法,这是处理注册事件的函数。
6、修改index.js,因为想在这里注册时候把数据存入到数据库中,所以这里需要引用上面第四步创建的model。具体代码如下所示。
- var User = require('../models/user');
-
-
-
-
-
- exports.index = function(req, res){
- User.find({}, function (err,users) {
- res.render('index', { title: 'Express',users:users });
- });
- };
-
- exports.reg=function(req,res){
- res.render('reg',{title:'Register Page'});
- };
- exports.doReg=function(req,res){
- var user = new User(req.body.user);
- user.save(function (err, user) {
- if(!err) {
- console.log(user);
- res.redirect('/')
- }
- });
- console.log(req.body.user);
- };
这一步要注意为什么是req.body.user,这里就是前面写页面直接用user[]这种形式带来的好处,如果单独写name="username",那么这里就应该是下面这种形式。
- var user = new User({
- name:req.body['username'],
- password:req.body['password']
- });
user.save就是把刚才数据提交到数据库,具体使用方法参看官方文档。save成功之后执行什么操作就自己发挥吧。保存之前也可以进行一些简单的表单验证等等。
7、通过登录来讲如何从数据库取出数据,继续修改index.js,如下所示。
- var User = require('../models/user');
-
-
-
-
- exports.index = function(req, res){
- User.find({}, function (err,users) {
- res.render('index', { title: 'Express',users:users });
- });
- };
- exports.login=function(req,res){
- res.render('log',{title:'Login Page'});
- } ;
- exports.doLogin=function(req,res){
- var user = req.body.user;
- User.find(user,function(err,docs){
- if(!err){
- if(docs!=''){
- console.log(docs);
- return res.redirect('/');
- } else{
- console.log('用户名或密码不正确');
- return res.redirect('/log');
- }
-
- }else{
- console.log("Something happend.");
- }
- })
- };
- exports.reg=function(req,res){
- res.render('reg',{title:'Register Page'});
- };
- exports.doReg=function(req,res){
- var user = new User(req.body.user);
- user.save(function (err, user) {
- if(!err) {
- console.log(user);
- res.redirect('/')
- }
- });
- console.log(req.body.user);
- };
这里通过find()方法来查询数据库,使用方法不解释了。第一个参数user就是要查询的数据,从输入框获取过来的,如果不是用user[]这种形式定义的name属性,那么这里一样的用{naem:req.body['username'],password:req.body['password']}这样的写法。回调函数docs就是从数据库查询返回的结果。
例子到此结束。