代码在github上:
nodejs-express-mongodb-website项目,所用的文件均可以在里面找到。
今天,我们主要完成与数据库mongodb的连接及通过注册的实现,完成对数据库进行写入的操作。
首先,我们完成与数据库的连接:
1、写数据库配置信息:
打开主目录下config.js,在里面写入以下代码:
/** *数据库信息 * @type {cookieSecret: string, db: string, host: string} */ exports.dbInfo = { cookieSecret:'12345', //数据库密码 db: 'website', //数据库名称 host: 'localhost' //数据库主机地址 };
2、新建连接帮助文件:
在主目录下,新建helper文件夹,用于存放各种帮助操作,在文件夹里创建dbHelper.coffee文件,写入以下代码:
config = require('../config') ##获取配置文件,以获得上面的配置信息 Db = require('mongodb').Db ##创建数据库 Connection = require('mongodb').Connection ##创建连接 Server = require('mongodb').Server ##创建服务 mongodb = new Db(config.dbInfo.db, new Server(config.dbInfo.host, Connection.DEFAULT_PORT, {auto_reconnect:true}), {safe: true}) ##创建mongodb对象 exports.newDb = () -> return mongodb ### 连接数据库 dbName ### exports.connectDB = (dbName, cb, success) -> mongodb.open (err, db) -> if err cb new Error(err) else db.collection dbName, (err, collection) -> if err cb new Error("数据库连接失败") mongodb.close() else if success and typeof success is "function" success(collection)
上面,暴露一个连接数据库中某张表的方法,例如,如果打开用户表,进行操作时,首先,调用此方法,进行表的连接,再进行操作,在下面,我们会进行用户注册,进行用户信息的写入操作,将会使用。
此方法调用时,需传入三个参数: 表的名字,一个回调函数,连接表成功后的操作函数;
再次,我们将进行用户注册的页面:
1、新建注册页面及路由:
在controllers文件夹下,创建user.coffee文件,用于写所有与用户相关的路由,如:
注册:/user/register 登录: /user/login 用户主页: /user/:id ......
创建后,先写注册路由(在user.coffee文件中写入):
userBll = require("../Bll/userBll"); ##添加用户业务逻辑模块 ### 注册 @param name @param email @param password ### exports.register_GET_POST = (req, res) -> loc = parseInt(Math.random() * 100) % 10 ##在已有的头像中随机头像 if req.method is "POST" user = name: req.body.name ##用户名 email : req.body.email ##用户邮箱 password : req.body.password ##用户密码 resNum: 0 ##回答数目 ansNum: 0 ##提问数目 avatar: "/images/avatar-big/default"+loc+".jpg" ##用户头像 score: 0 ##用户积分 userBll.register user,(err, result)-> if err res.send code: 1 message: err.message else setSession(req, result[0]) res.redirect '/explore' else res.render "register", isLogin: true ### 创建session ### setSession = (req, result) -> req.session.userId = result._id.toString() req.session.userName = result.name req.session.userEmail = result.email req.session.userAvatar = result.avatar
在上面,首先添加需要的相关模块,目前,需要用户逻辑模块,这个一会儿我们会在下面完成,再次,则暴露出注册的接口,它分为post和get请求,get请求则为请求注册页面,post请求则为注册的接口,进行用户注册。对于,用于用户注册的接口,我们在下面再详细说,目前只为了能够打开注册页面,而最后的setSession方法则是在注册成功后,让其自动为登录状态并写入session中。
在上面的暴露的register接口中,当get方法时,有以下代码:
res.render "register", isLogin: true
它就是用于渲染注册页面,而isLogin用于控制在页面中是否展示登录框,当设置为true时,则不展示,控制代码在views/shared/layout.html中,有如下代码:
大括号% if !isLogin %大括号 //code 大括号% endif %大括号 这是swig写法,如果!isLogin为true时,渲染其中html代码,反之,不渲染;
在主目录views中创建user文件夹,用于与上controllers中user.coffee的路由进行对应,用于存放所以用户相关的页面,如注册、登录、用户信息等页面;
在上面新建的user文件夹下创建register.html文件,写入如下代码(注:因为编译原因,’大括号’就是表示 ‘{’ 或者 ‘}’):
大括号% extends '../shared/layout.html' %大括号 大括号% block content %大括号 <div id="contents" class="register"> <div class="clearfix"> <h1>欢迎加入车谈</h1> <form method="post" action="/user/register"> <div class="name"> <label>名号</label><input name="name" type="text"/> </div> <div class="email"> <label>邮箱</label><input name="email" type="text"/> </div> <div class="pwd"> <label>密码</label><input name="password" type="password"/> </div> <div class="submit"> <input type="submit" disabled value="注册"/> </div> </form> </div> </div> 大括号% endblock %大括号
2、添加userBll.coffee,启动,展示注册页面:
在主目录下的Bll文件下,创建userBll.coffee文件,暂时不写入任何代码,再启动redis和mongodb服务,在主目录下,通过命令行,运行如下:
nodejs app
注:在每次启动时,需要把所有coffee文件重新编译为js文件,我使用的webstorm自动编译的,也可查看coffeeScript的文档,通过命令编译。否则,会报错而无法运行。
启动后,在浏览器中输入:http://localhost/user/register
最后,我们来写注册用户接口,即在页面中form表单提交的接口: /user/register, 方法是post请求:
1、连接数据库及用户信息写入数据库:
在主目录下的Dal文件夹中,创建dbUser.coffee文件,其为与用户相关的与数据库的操作的代码,如注册时写入用户信息到数据库,登录时查询用户信息,获取用户信息时从数据库查询用户信息等方法;
创建成功后,先写入以下代码:
dbHelper = require('../helper/dbHelper') ##添加数据库帮助模块,用于获取connectDB方法 mongodb = dbHelper.newDb(); ### 注册 @param user.name {String} 用户名 @param user.password {String} 用户密码 @param user.email {String} 用户登录邮箱 @param user.resNum {Number} 用户回答问题数目 @param user.ansNum {Number} 用户提出问题数目 @param user.avartar {String} 用户头像url @param user.score {Number} 用户积分 ### exports.register = (user, cb) -> dbHelper.connectDB "userInfo", cb, (collection) -> collection.findOne user, (err, doc) -> if doc cb new Error("已经存在该用户") mongodb.close() else collection.insert user, { safe: true }, (err, u) -> if err cb new Error("注册失败") else cb null, u mongodb.close()
此方法,向外暴露注册用户的接口,以供业务逻辑中注册接口调用,需要传入两个参数: user及cb,其中,user为一个用户信息对象,然后就是一个回调函数,首先,调用刚刚上面写的dbHelper文件中的connectDB方法,
在调用时,传入需要连接的表名‘userInfo’,还有回调函数及连接成功后需要执行的函数:
连接成功后,首先通过传入的用户对象,在数据库进行匹配,查出是否已经拥有此用户,其中,findOne方法就是mongodb中查找一个的方法,如果查询出来了,说明已经存在,则调用回调函数cb然后关闭mongodb,如果没有查询出来,说明还没注册,则将用户信息写入数据库,则使用mongodb中insert用法,如果插入成功,则返回一个null的错误及注册用户信息,如果插入失败,则返回一个“注册失败”的错误;注:如果需要更加详细了解mongodb用户,可以查看其官网文档;
2、添加业务逻辑文件中注册接口:
在上面创建的 /Bll/userBll.coffee文件中添加如下代码:
dbUser = require("../Dal/dbUser") ### 注册 ### exports.register = (user, cb) -> dbUser.register user, cb
其将供 /controllers/user中的register接口调用,调用代码在上面用户注册的post方法中;
3、启动
使用以前方式,在主目录下,通过命令行,使用
node app启动,但是,会报如下错误:
Error: Cannot find module 'mongodb'说明缺少‘mongodb’模块,则在主目录下,使用如下添加:
npm install mongodb --save
然后,重新启动,然后如果不报错,则打开浏览器,打开localhost/user/register
然后进行注册测试;如果需要查询注册的用户信息,则使用如下:
1、使用cmd打开命令行,
2、进入你安装的mongodb安装位置,找到bin文件夹目录,然后运行如下:
mongo
则会显示:
Mongodb shell version: 版本号(我这儿是2.4.12)
……
>
则启动mongodb命令行,则可以进行mongodb相关操作
3、打开数据库并查看用户信息(在刚刚打开的mongodb命令行中操作)
show dbs //查看所有的mongodb数据库
会显示你目前有的所有的mongodb数据库
use website //使用某个数据库,我们使用的是website数据库(在config.js中配置的)
会显示:switched to db website,说明目前使用的是website数据库
db.userInfo.find() //查看用户表内容
会显示所有用户表的内容,则可以查看是否注册成功并写入数据库;