使用nodejs、mongodb、express、linux搭建社区网站(4)-mongodb连接及注册的开发

代码在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() //查看用户表内容

会显示所有用户表的内容,则可以查看是否注册成功并写入数据库;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,可以用于开发服务器端的应用程序。Express是Node.js的一个快速、灵活和极简的Web应用程序框架。MongoDB是一个面向文档的NoSQL数据库。它将数据存储在JSON样式的文档中,具有强大的灵活性和可扩展性。 在Node.js中使用MongoDB,可以使用node-mongodb-native驱动程序。首先需要安装MongoDB,并确保其服务正在运行。然后,可以使用Monk库来实现Node.js和MongoDB的交互[2]。使用Monk,你可以使用简单的JavaScript代码来连接MongoDB数据库,执行查询和更新操作。 下面是一个使用Monk连接MongoDB的示例代码: ``` var mongo = require('mongodb'); var monk = require('monk'); var db = monk('localhost:27017/nodetest1'); ``` 在上述代码中,我们使用`monk`模块连接到本地的`nodetest1`数据库。 通过使用Node.js、ExpressMongoDB,你可以构建强大的Web应用程序,实现数据的存储和检索功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [NodeJS+Express+MongoDB](https://blog.csdn.net/weixin_33712881/article/details/85842769)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Node.js + Express + MongoDB教程](https://blog.csdn.net/boleban/article/details/39134661)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值