1. 程式人生 > >node.js中實現使用者註冊的功能

node.js中實現使用者註冊的功能


    終於決定要實現註冊的功能了,開啟虛擬機發現,mongodb不能啟動,我真是無語到了極點,谷歌了好久,原來是因為老是直接關閉虛擬機器造成的,
沒辦法,刪除.lock檔案 重啟就可以了,別人還要  --repair一下,我直接略過,粗學者,就懂那麼多啊,不過我也漲記性了,以後shutdown -h now一下。

        設計一個簡單的表結果,因為mongodb也比較特殊,我仍舊是一個粗學者,每次插入的時候,它會自動建立表,我們只需要常見一個db就可以了哦。然後下面這是表結構:

/* user table*/
username  password  isValid  email  createTime  validCode
使用者名稱      密碼    是否驗證    郵箱    註冊時間    郵箱驗證碼


        簡單點,複雜的我也整不來。

        今天先實現部分的註冊功能,請注意,是部分的,簡單到只是往mongodb中插一條資料,當然如果資料已經存在,就不插入了。

        首先寫了一個蹩腳的mongodb類,然後寫了一個usermongodb的資料庫操作類,繼承mongodb類,最後寫了一個register.js來處理請求,最最後寫了一個jade模板頁,

html
    head
        meta(charset='utf-8')
        link(rel="stylesheet",href="style.css")
        title 註冊
    body
        form(action='/register/index', method='POST')
            p 
                span 使用者名稱
                input(type='text',name='username',value='')
            p 
                span 密碼
                input(type='password',name='password')
            p
                span 郵箱
                input(type='text',name='email')
            input(type='submit',value='註冊')

        雖然簡單,但是足足除錯了一個小時,誰讓自己是一個粗學者了!

       跪的地方比較多,首先就是那個_self ,大家看到了沒有,之前寫的this,我卡,系統找不到方法,還提示util錯誤,我那知道util錯誤是啥啊。究其原因,主要是回撥函式中使用this,this物件指代變換了。

this.addUser = function (userData, callback) {
        //判斷使用者名稱是否存在
        if (!userData.username) {
            return;
        }
        //使用者名稱不能重複
        var usernameJson = {"username": userData.username};
        this.findOneByID(this.tableName, usernameJson, function (ret) {
            if (!ret) {
                //如果使用者名稱不存在,則新增使用者
                _self.insert(_self.tableName, userData, function (ret2) {
                    if (ret2) {
                        callback(true);
                    } else {
                        callback(false);
                    }
                });
            }
            else {
                callback(false);
            }
        });
    }

        然後就是調查遊標這個物件,我卡,讀英文說,單向遍歷,轉換陣列,回撥函式一個是err,一個是陣列,要是遊標移動了什麼的,陣列就不完成了什麼的,暈了!最後就有了rewind這個東西。但是,這都不是重點,不是重點,重點是docs返回個是一個空,請注意,console.log列印是一個空,不是一個[],看英文文件理解錯了,【he first parameter will contain the Error object if an error occured, or null otherwise.】,我還以為返回出錯了,然後發現.length一下居然返回一個0,坑!
 this.findOneByID = function (tableName, whereJson, callback) {
        connection(function (mdbConn) {
            mdbConn.collection(tableName, function (err, collection) {
                if(err){
                    return;
                }
                var cursor = collection.find(whereJson);
                cursor.toArray(function (err, docs) {
                    if (err) {
                        callback(false);
                    }
                    else {
                        var row = docs.shift();     //undefined
                        callback(row);
                    }
                });
                cursor.rewind();
            })
        });
    }

    無語的是,插入的時候插入幾個欄位,資料庫裡就幾個欄位,我之前設計的沒有插進去,還是功力不夠深厚啊!!!

        好吧,估計也沒有人看,睡吧,寫給自己以後豐富的。後續註冊要新增郵箱驗證,登入,日誌什麼的,下個星期在說吧。