express 相關(guān)知識(shí)

express相關(guān)

標(biāo)簽(空格分隔): 未分類


  1. mac下執(zhí)行 sudo ./mongod必須加 sudo
    不加會(huì)這樣

    lock file on a read-only directory: /data/db, terminating
    2017-09-07T11:42:02.936+0800 I NETWORK  [initandlisten] shutdown: going to close listening sockets...
    2017-09-07T11:42:02.936+0800 I NETWORK  [initandlisten] shutdown: going to flush diaglog...
    2017-09-07T11:42:02.936+0800 I CONTROL  [initandlisten] now exiting
    2017-09-07T11:42:02.936+0800 I CONTROL  [initandlisten] shutting down with code:100
    
    
    
  2. mongdb的基本操作

    • show dbs 顯示當(dāng)前數(shù)據(jù)庫(kù)
    • use xx(dbName) 使用數(shù)據(jù)庫(kù)
    • db.cat.find()
      命令行操作
  3. sql mongodb
    table collection
    row document
    primaryKey primaryKey(id)

    mongodb基本概念 數(shù)據(jù)庫(kù)概念不變

    sql mongodb
    table collection
    row document
    primaryKey primaryKey(id)
    mongodb
  4. 數(shù)據(jù)庫(kù)操作

    var mongoose = require('mongoose');
    
    
    var saveData=function(){
    mongoose.connect('mongodb://localhost/test');
    
    var Cat = mongoose.model('Cat', { name: String });
    
    var kitty = new Cat({ name: 'Zildjian' });
    kitty.save(function (err) {
      if (err) {
        console.log(err);
      } else {
        console.log('meow');
      }
    });
    }
    
    module.exports=saveData
    
  5. cookie和session

簡(jiǎn)單講

client請(qǐng)求server ---> server按照一定規(guī)則生成一個(gè)session并給客戶端set-cookie,服務(wù)端維持一個(gè)session表(缺點(diǎn):集群怎么辦) --->client帶上sessionId訪問server 客戶端每次帶過去cookie娄猫,服務(wù)器就可以知道哪些訪問過了(實(shí)現(xiàn)記住狀態(tài))

express實(shí)現(xiàn)

var cookieParser = require('cookie-parser');

...
app.use('/cookie',function(req,res){
    if(req.cookies.isVisited){
        console.log(req.cookies)
        res.send("歡迎再次訪問")
    }
    else{
        res.cookie("isVisited",1,{
            maxAge:60*1000
        })
        res.send("歡迎第一次訪問")
    }
})

cookie可以被客戶端修改,不安全茂缚,所以我們需要在服務(wù)端實(shí)現(xiàn)seesion

cookie

express 中操作 session 要用到 express-session 這個(gè)模塊,主要的方法就是 session(options),其中 options 中包含可選參數(shù)决瞳,主要有:

  • name: 設(shè)置 cookie 中戏挡,保存 session 的字段名稱芍瑞,默認(rèn)為 connect.sid 。
  • store: session 的存儲(chǔ)方式褐墅,默認(rèn)存放在內(nèi)存中拆檬,也可以使用 redis,mongodb 等妥凳。express 生態(tài)中都有相應(yīng)模塊的支持竟贯。
  • secret: 通過設(shè)置的 secret 字符串,來計(jì)算 hash 值并放在 cookie 中逝钥,使產(chǎn)生的 signedCookie 防篡改屑那。
  • cookie: 設(shè)置存放 session id 的 cookie 的相關(guān)選項(xiàng),默認(rèn)為
    (default: { path: '/', httpOnly: true, secure: false, maxAge: null })
  • genid: 產(chǎn)生一個(gè)新的 session_id 時(shí)晌缘,所使用的函數(shù)齐莲, 默認(rèn)使用 uid2 這個(gè) npm 包。
  • rolling: 每個(gè)請(qǐng)求都重新設(shè)置一個(gè) cookie磷箕,默認(rèn)為 false选酗。
  • resave: 即使 session 沒有被修改,也保存 session 值岳枷,默認(rèn)為 true芒填。

默認(rèn)保存在內(nèi)存中,下面采用寫文件方式

app.use(session({
    name: "ljd",
    store: new FileStore(),
    secret:'I am a secret oooooo',  //用來簽名
    saveUninitialized: false,  // 是否自動(dòng)保存未初始化的會(huì)話空繁,建議false
    resave: false,  // 是否每次都重新保存會(huì)話殿衰,建議false
    cookie: { maxAge: 60 * 1000 }

}))
app.use('/session',function(req,res){
    if(req.session.isVisit) {
    req.session.isVisit++;
    res.send('<p>第 ' + req.session.isVisit + '次來到此頁(yè)面</p>');
  } else {
    req.session.isVisit = 1;
    res.send('歡迎第一次來這里');
  }
})

session 的運(yùn)作通過一個(gè) session_id 來進(jìn)行。session_id 通常是存放在客戶端的 cookie 中盛泡,比如在 Express 中闷祥,默認(rèn)是 connect.sid 這個(gè)字段,當(dāng)請(qǐng)求到來時(shí)傲诵,服務(wù)端檢查 cookie 中保存的 session_id 并通過這個(gè) session_id 與服務(wù)器端的 session data 關(guān)聯(lián)起來凯砍,進(jìn)行數(shù)據(jù)的保存和修改。
這意思就是說拴竹,當(dāng)你瀏覽一個(gè)網(wǎng)頁(yè)時(shí)悟衩,服務(wù)端隨機(jī)產(chǎn)生一個(gè) 1024 比特長(zhǎng)的字符串,然后存在你 cookie 中的 connect.sid字 段中栓拜。當(dāng)你下次訪問時(shí)座泳,cookie會(huì)帶有這個(gè)字符串惠昔,然后瀏覽器就知道你是上次訪問過的某某某,然后從服務(wù)器的存儲(chǔ)中取出上次記錄在你身上的數(shù)據(jù)挑势。由于字符串是隨機(jī)產(chǎn)生的镇防,而且位數(shù)足夠 多,所以也不擔(dān)心有人能夠偽造薛耻。

cookie中只存sessionId并存數(shù)據(jù)营罢,數(shù)據(jù)存在服務(wù)端

代碼戳這里

  1. res.render('login') 模板引擎是ejs的話不能正確render
  2. jade 模板 切記不可空格回車混用
  3. module.exports如何導(dǎo)出函數(shù)
  4. 注意回調(diào)返回順序,異步問題饼齿∷茄回調(diào)異步變同步。
var User = require("../mongo/user.js");

function insert(data,callback) {
    console.log("傳入的data",data)
    let result={}
    var user = new User({
        username : data.username,                 //用戶賬號(hào)
        userpwd: data.psw,                            //密碼
        // userage: 37,                                //年齡
        logindate : new Date()                      //最近登錄時(shí)間
    });
let saveStatue=user.save(callback);
 // let saveStatus=user.save(function (err, res) {
 //     console.log("userSave")

 //        if (err) {
 //            console.log("Error:" + err);
 //            result=res
 //        }
 //        else {
 //         console.log("插入成功")
 //            console.log("Res:" + res);
 //            result=res
 //        }

 //    });
 // return result
}

// insert();
module.exports=insert

注意注釋部分缕溉,mongoose的save是異步操作考传,你在后面return result的話save的執(zhí)行結(jié)果還沒出,所以結(jié)果為空证鸥。
正確做法是將異步的函數(shù)放入回調(diào)
思考:能否用promise實(shí)現(xiàn)

function demo(data,callback){
    
    db.save(callback)
} 
module.exports=demo

demo({data},(err,data)=>{
    if(err){
        console.log(err)
    }
    else{
        res.json(data)
    }
})

Promise對(duì)象實(shí)現(xiàn)方式

不要把promise對(duì)象復(fù)雜化,注意最后一定要resolve(res)這樣.then操作才可以到值

function insert(){
    return new Promise((resolve,reject)=>{
        db.save(data,(err,data)=>{
            if(err){
                console.log(err)
            }
            else{
                console.log(res)
                resolve(res)
            }
        })
    })
}

然后就可以在外面調(diào)用了

insert(data).then((res)=>{
    console.log(res)
})

Nice!

參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末僚楞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子枉层,更是在濱河造成了極大的恐慌泉褐,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸟蜡,死亡現(xiàn)場(chǎng)離奇詭異膜赃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)揉忘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門跳座,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泣矛,你說我怎么就攤上這事疲眷。” “怎么了您朽?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵狂丝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我哗总,道長(zhǎng)几颜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任魂奥,我火速辦了婚禮菠剩,結(jié)果婚禮上易猫,老公的妹妹穿的比我還像新娘耻煤。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布哈蝇。 她就那樣靜靜地躺著棺妓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炮赦。 梳的紋絲不亂的頭發(fā)上怜跑,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音吠勘,去河邊找鬼性芬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剧防,可吹牛的內(nèi)容都是我干的植锉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼峭拘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼俊庇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸡挠,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辉饱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拣展,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彭沼,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年瞎惫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了溜腐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓜喇,死狀恐怖挺益,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乘寒,我是刑警寧澤望众,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站伞辛,受9級(jí)特大地震影響烂翰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚤氏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一甘耿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竿滨,春花似錦佳恬、人聲如沸捏境。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)垫言。三九已至,卻和暖如春倾剿,著一層夾襖步出監(jiān)牢的瞬間筷频,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工前痘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凛捏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓芹缔,卻偏偏與公主長(zhǎng)得像葵袭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乖菱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容