express相關(guān)
標(biāo)簽(空格分隔): 未分類
-
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
-
mongdb的基本操作
-
show dbs
顯示當(dāng)前數(shù)據(jù)庫(kù) -
use xx(dbName)
使用數(shù)據(jù)庫(kù) -
db.cat.find()
命令行操作
-
-
sql mongodb table collection row document primaryKey primaryKey(id) mongodb基本概念 數(shù)據(jù)庫(kù)概念不變
sql mongodb table collection row document primaryKey primaryKey(id) mongodb -
數(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
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
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ù)端
- res.render('login') 模板引擎是ejs的話不能正確render
- jade 模板 切記不可空格回車混用
-
module.exports
如何導(dǎo)出函數(shù) - 注意回調(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!
參考資料: