node學習筆記之39
node學習筆記 系列之 39
一、url 模組的基本使用
url.parse
url.format
url.resolve
const url = require("url");
const path = "%20node%20request%20post%E8%AF%B7%E6%B1%82&rsv_spt=1&rsv_iqid=0xb9778e3c000b4a9e&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&oq=request%2520post%25E8%25AF%25B7%25E6%25B1%2582&inputT=1575&rsv_t=3da2Tn%2F7uIuHWTsROFo6yvwMvultNv5wmOTlrQiVQ6KLFbNtnrLXkdd9HWuhNlyq7zNM&rsv_pq=feaadbf200091d61&rsv_sug3=35&rsv_sug2=0&rsv_sug4=2259";
const urlObject = url.parse(path,true);
//console.log(url.format(urlObject));
console.log(url.resolve("/a/b/c","d"));
console.log(url.resolve("/a/b/c","/d"));
二、queryString 模組的基本使用
queryString.escape()
queryString.parse()
queryString.stringify()
queryString.unescape()
const qs = require("querystring");
var str = "name*alley#age*20";
var obj = qs.parse(str,"#","*");
//console.log(qs.stringify(obj,"@","!"))
var str = "name=alley=sex=19"
var key = qs.escape("name=alley=sex");
console.log(qs.unescape(key))
三、events 模組的基本使用
on: 繫結事件
once: 只執行一次事件
emit: 執行匹配的事件
prependListener :將當前事件放到佇列的最前面
removeALLListeners: 移除所有事件
removeListener: 移除指定事件監聽
defaultMaxListeners : events 預設的繫結事件只能繫結 10 個如果想繫結多個需要配置
const EventEmitter = require("events");
class MyEventEmitter extends EventEmitter{};
const myEventEmitter = new MyEventEmitter();
/*
on: 事件訂閱
emit :事件觸發
removeListener :移除一個時間
removeAllListeners :移除所有事件
once: 只繫結一次函式
*/
function fn1(val){
console.log(111,val)
}
function fn2(val){
console.log(222,val)
}
function fn3(val){
console.log(333,val)
}
myEventEmitter.once("handle",fn1)
myEventEmitter.once("handle",fn2)
myEventEmitter.once("handle",fn3)
//myEventEmitter.removeListener("handle",fn1)
//myEventEmitter.removeAllListeners("handle")
myEventEmitter.emit("handle","alley")
myEventEmitter.emit("handle","alley")
四、File System 模組基本使用
得到檔案與目錄的資訊:stat
建立一個目錄:mkdir
建立檔案並寫入內容:writeFile,appendFile
讀取檔案的內容:readFile readFileSync
列出目錄的東西:readdir
重新命名目錄與檔案:rename
刪除目錄與檔案:rmdir,unlink
const fs = require("fs");
const path = require("path");
fs.stat("./index.js",(err,data)=>{
console.log(data.isDirectory());
})
var data = fs.statSync("./index.js");
console.log(data.isFile())
fs.mkdir(path.resolve(__dirname,"./demo"),(err)=>{});
fs.writeFile(path.resolve(__dirname,"./demo/index.txt"),"abc",(err)=>{})
fs.readFile(path.resolve(__dirname,"./demo/index.txt"),(err,data)=>{
console.log(data+"");
})
fs.rename(path.resolve(__dirname,"./demo/index.txt"),path.resolve(__dirname,"./demo/list.txt"),(err)=>{})
fs.readdir(path.resolve(__dirname,"../../ 隨堂案例 "),(err,list)=>{
console.log(list)
})
fs.unlink(path.resolve(__dirname,"./demo/list.txt"),()=>{})
fs.rmdir(path.resolve(__dirname,"./demo"),(err)=>{})
/*
stat: 判斷檔案型別
isFile :判斷是否是一個檔案
isDirectory: 判斷是否是一個資料夾
mkdir :建立資料夾
writeFile(path,content,callback) :建立並寫入
path :路徑
content: 內容
callback :回撥
readFile(path,callback(err,data)): 讀操作
rename: 重新命名檔案或者資料夾
oldPath
newpath
readdir: 列出資料夾中所有檔案
unlink: 刪除檔案
rmdir: 刪除資料夾
*/
五、stream 檔案流
fs.createReadStream(): 建立可讀檔案流 引數 1 :已有檔案
fs.createWriteStream(): 建立可寫檔案流 引數 1 :檔名稱
pipe: 管道
// 鏈式使用 pipe
const fs = reqiure("fs");
// 壓縮模組
const zlib = require("zlib");
const read = fs.createReadStream("");
const write = fs.createWriteStream("");
// 先進行壓縮然後在給 write 檔案 16 進位制
read.pipe(zlib.createGzip()).pipe(write);
六、path 模組的基本使用
path.join
path.resolve
const path = require("path");
/*
join: 路徑拼接
resolve: 將引數轉換為絕對路徑
*/
console.log(path.join("/a","b","c"));
console.log(path.join(__dirname,"./index.js"));
console.log(path.resolve(__dirname,"./index.js"));
七、process
process.env
process.argv
console.log(process.env)
var arr = process.argv;
if(arr.indexOf("-v") !== -1){
console.log("1.11.1");
}else{
console.log("help....")
}
八、http 模組
http.createServer
http.get
http.post
request
cheerio 小爬蟲
createServer
const http = require("http");
const server = http.createServer((req,res)=>{
//console.log(req.url,req.method)
console.log(req.headers)
// res.statusCode = 404;
// res.setHeader("content-type","text/plain;charset=utf8");
res.writeHead(200,{"content-type":"text/plain;chartset=utf8"})
res.write(" 我最近很好 ")
res.write(" 不用你擔心 ")
res.write(" 再見 ")
res.end("NodeJS")
})
server.listen(9000,()=>{
console.log("server address:localhost:9000")
})
http.get
const http = require("http");
const path = "( 網頁 )
http.get(path,(res)=>{
var str = "";
// 因為資料接收是一塊一塊接收的 類似於流水一樣
res.on("data",(data)=>{
str += data;
})
res.on("end",()=>{
console.log(str);
})
})
var path = " 介面
http.get(path,(res)=>{
var str = "";
res.on("data",(data)=>{
str += data;
})
res.on("end",()=>{
console.log(JSON.parse(str));
})
})
request
const request = require("request");
const qs = require("querystring");
const options = {
url: "
method: "POST",
headers: {
"os": "wap"
},
body: qs.stringify({
free: 0,
finish: 0,
group: 1,
sortId: "",
page: 1,
pageSize: 10,
})
}
request(options, (err, res, body) => {
console.log(JSON.parse(body));
})
/*
1 、 cnpm install request -S
request(options,callback(err,res,body))
err: 錯誤
res: 整個響應體
body :響應的資料
options = {
method:"" ,
url:"" ,
headers:{},
body:{ 請求的引數 }
}
*/
小爬蟲
const http = require("http");
// 可以讓我們以 jQuery 語法來進行 dom 查詢 並不是對 dom 操作
const cheerio = require("cheerio");
const fs = require("fs");
const path = require("path");
const url = "
http.get(url,(res)=>{
var str = "";
res.on("data",(data)=>{
str += data;
})
res.on("end",()=>{
// 將 str 封裝到 $ 符號中去
var $ = cheerio.load(str);
var banner_up_left = $(".banner_up_left>a");
var arr = [];
for(var i=0;i<banner_up_left.length;i++){
var obj = {};
obj.id = i;
obj.text = banner_up_left.eq(i).find("span").text();
arr.push(obj);
}
fs.readFile(path.join(__dirname,"./data/index.json"),(err,data)=>{
var dataList = JSON.parse(data+"")
if(!dataList.data){
dataList.data = [];
}
dataList.data = arr;
fs.writeFile(path.join(__dirname,"./data/index.json"),JSON.stringify(dataList),(err)=>{})
})
})
})
九、路由
什麼是路由?
路由的作用
前端路由與後端路由
路由核心屬性
supervisor
const http = require("http");
const path = require("path");
const fs = require("fs");
const url = require("url");
const server = http.createServer((req, res) => {
const { pathname, query } = url.parse(req.url, true);
if (pathname == "/") {
fs.readFile(path.join(__dirname, "./public/index.html"), (err, data) => {
res.writeHead(200, { "contentType": "text/html;charset=utf8" });
res.end(data);
})
} else if (pathname == "/order") {
fs.readFile(path.join(__dirname, "./public/html/order.html"), (err, data) => {
res.writeHead(200, { "contentType": "text/html;charset=utf8" });
res.end(data);
})
} else if (pathname == "/list") {
fs.readFile(path.join(__dirname, "./public/html/list.html"), (err, data) => {
res.writeHead(200, { "contentType": "text/html;charset=utf8" });
res.end(data);
})
} else if (pathname == "/css/index.css") {
fs.readFile(path.join(__dirname, "./public/css/index.css"), (err, data) => {
res.writeHead(200, { "content-type": "text/css;charset=utf8" });
res.end(data);
})
} else if (pathname == "/js/index.js") {
fs.readFile(path.join(__dirname, "./public/js/index.js"), (err, data) => {
res.writeHead(200, { "content-type": "application/x-javascript;charset=utf8" });
res.end(data);
})
} else if (/\/img\/(.*)\.(jpg|png|gif)/.test(pathname)) {
fs.readFile(path.join(__dirname, "./public/img/" + RegExp.$1 + "." + RegExp.$2), (err, data) => {
res.writeHead(200, { "content-type": "image/" + RegExp.$2 });
res.end(data);
})
} else if (pathname == "/users/register") {
let { username, password } = query;
fs.readFile(path.join(__dirname, "./public/data/user.json"), (err, data) => {
let userData = JSON.parse(data.toString());
var bStop = true;
for (var i = 0; i < userData.data.length; i++) {
if (userData.data[i].username == username) {
bStop = false;
break;
}
}
if (bStop) {
userData.data.push({ username, password });
fs.writeFile(path.join(__dirname, "./public/data/user.json"), JSON.stringify(userData), (err) => {
if (!err) {
res.writeHead(200, { "content-Type": "application/json;charset=utf-8" })
res.end(JSON.stringify({
code: 200,
errMsg: "",
data: {
code: 1,
info: " 註冊成功 "
}
}))
}
})
} else {
res.writeHead(200, { "content-Type": "application/json;charset=utf-8" })
res.end(JSON.stringify({
code: 200,
errMsg: "",
data: {
code: 0,
info: " 使用者名稱重複 "
}
}))
}
})
}
})
server.listen(9000, () => {
console.log("server address:127.0.0.1:9000")
})
十、封裝路由級靜態資源處理
const url = require("url");
const fs = require("fs");
const path = require("path");
const qs = require("querystring")
// 收集事件
const routerMap = {
get:{},
post:{}
}
const router = function(req,res){
// 給 res 新增一個 json 方法
res.json = function(obj){
res.end(JSON.stringify(obj))
}
// 處理靜態資源
handleStatic(req,res);
// 獲取使用者請求的方式
var method = req.method.toLowerCase();
// 獲取使用者請求的地址
var {pathname,query} = url.parse(req.url,true);
if(method === "get"){
if(routerMap.get[pathname]){
// 將 query 的值賦值給 req.query
req.query = query;
routerMap.get[pathname](req,res)
}else{
res.end("404")
}
}else if(method === "post"){
if(routerMap.post[pathname]){
var str = "";
// 獲取 post 傳遞的引數
req.on("data",(data)=>{
str += data;
})
req.on("end",()=>{
req.body = qs.parse(str);
routerMap.post[pathname](req,res)
})
}
}
}
// 註冊事件
router.get = function(path,callback){
routerMap.get[path] = callback;
}
// 註冊事件
router.post = function(path,callback){
routerMap.post[path] = callback;
}
// 處理所有的靜態資源訪問
function handleStatic(req,res){
var {pathname} = url.parse(req.url,true);
// 獲取檔案的字尾
var ext = pathname.substring(pathname.lastIndexOf("."));
if(pathname ==="/"){
res.writeHead(200,{"content-type":"text/html;charset=utf8"});
res.end(getFile(path.join(__dirname,"../public/index.html")))
}else if(ext === ".css"){
res.writeHead(200,{"content-type":"text/css;charset=utf8"});
res.end(getFile(path.join(__dirname,"../public",pathname)));
}else if(ext === ".js"){
res.writeHead(200,{"content-type":"application/x-javascript;charset=utf8"});
res.end(getFile(path.join(__dirname,"../public",pathname)));
}else if(/.*\.(jpg|png|gif)/.test(ext)){
res.writeHead(200,{"content-type":`image/${RegExp.$1};charset=utf8`});
res.end(getFile(path.join(__dirname,"../public",pathname)));
}else if(ext === ".html"){
res.writeHead(200,{"content-type":"text/html;charset=utf8"});
res.end(getFile(path.join(__dirname,"../public",pathname)));
}
}
function getFile(filePath){
return fs.readFileSync(filePath);
}
module.exports = router;
十一、mongoodb 級 mongoose 的基本使用
1 、 mongodb 安裝
下載地址:
下一步傻瓜式安裝
配置環境變數
啟動mongod --dbpath c:\data\db 開啟資料庫伺服器 ( 開啟 )
終端末尾顯示27017 代表成功
2 、關係型資料庫與非關聯式資料庫區別
優點:
1 )成本: nosql 資料庫簡單易部署,基本都是開源軟體,不需要像使用 oracle 那樣花費大量成本購買使用,相比關係型資料庫價格便宜。
2 )查詢速度: nosql 資料庫將資料儲存於快取之中,關係型資料庫將資料儲存在硬碟中,自然查詢速度遠不及 nosql 資料庫。
3 )儲存資料的格式: nosql 的儲存格式是 key,value 形式、文件形式、圖片形式等等,所以可以儲存基礎型別以及物件或者是集合等各種格式,而資料庫則只支援基礎型別。
4 )擴充套件性:關係型資料庫有類似 join 這樣的多表查詢機制的限制導致擴充套件很艱難。
缺點:
1 )維護的工具和資料有限,因為 nosql 是屬於新的技術,不能和關係型資料庫 10 幾年的技術同日而語。
2 )不提供對 sql 的支援,如果不支援 sql 這樣的工業標準,將產生一定使用者的學習和使用成本。
3 )不提供關係型資料庫對事物的處理。
3 、 mongodb 常用命令
mongod --dbpath c:\data\db 開啟資料庫伺服器 ( 開啟 )
27017---- 》 mongodb 的埠號 http:80 || 8080 https:443
mongo 進入資料庫伺服器
show dbs 檢視資料庫伺服器中有多少資料庫
use 資料庫名稱 建立 / 切換資料庫 如果資料庫中沒有表的情況下 資料庫並不會真正的建立
db || db.getName() 檢視當前使用的資料庫
db.dropDatabase() 刪除資料庫
表的操作
db.createCollection(" 表名稱 ") 建立表
db.getCollectionNames() 獲取資料庫中所有的表
db.getCollection(' 表名稱 ') 使用某一張表
db. 表名 .drop() 刪除某一張表
增
db. 表名 .save({ 欄位 })
刪
db. 表名 .remove({}) 刪除所有
db. 表名 .remove({ 欄位 }) 刪除指定欄位
改
db. 表名 .update({ 欄位 },{$set:{ 欄位 }})
db. 表名 .update({ 欄位 },{$inc:{ 欄位 ( 數字 )}})
查
db. 表名 .find() 查詢所有資料
db. 表名 .find({age:19}) 查詢指定欄位
db. 表名 .find({age:{$gt:22}}) 大於 22 的資料
db. 表名 .find({age:{$lt:22}}) 小於 22 的資料
db. 表名 .find({age:{$gte:22}}) 大於等於 22 的資料
db. 表名 .find({age:{$lte:22}) 小於等於 22 的資料
db. 表名 .find({age:{$gte:30,$lte:22}) 大於等於 30 小於等於 22 的資料
db. 表名 .find({name:/alley/}) 模糊查詢 找到資料中有 alley 的資料
db. 表名 .find({age:/^alley/}) 查詢首字元是 alley
db. 表名 .find({age:/alley$/}) 查詢尾字元是 alley
db. 表名 .find({},{name:1,_id:0}) 只顯示 name 這個欄位
db. 表名 .find().sort({age:1}) 正序
db. 表名 .find().sort({age-1}) 降序
db. 表名 .find().limit(n) 顯示多少條資料
db. 表名 .find().skip(n) 跳過多少條資料
db. 表名 .find().skip(n).limit(m) 跳過多少條 顯示多少條
db. 表名 .findOne({}) 查詢一條資料
db. 表名 .find().count() 查詢表中有多少條資料
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2686750/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- node學習筆記筆記
- node fs學習筆記筆記
- iOS學習筆記39 ReactiveCocoa入門iOS筆記React
- node基礎學習筆記筆記
- Node中Buffer學習筆記筆記
- Node.js學習筆記Node.js筆記
- Node.js學習筆記(一)Node.js筆記
- Node.js學習筆記1Node.js筆記
- node事件迴圈學習筆記事件筆記
- <node.js學習筆記(2)>Node.js筆記
- <node.js學習筆記(1)>Node.js筆記
- Node學習筆記 Mongodb 和 Mongoose筆記MongoDB
- JavaScript學習筆記(四十八)——Node.js之ExpressJavaScript筆記Node.jsExpress
- node 學習筆記 基礎入門筆記
- 《Node.js實戰》學習筆記Node.js筆記
- Solidity語言學習筆記————39、獨立彙編Solid筆記
- node學習筆記第八節:模組化筆記
- web前端培訓分享node學習筆記Web前端筆記
- Node.js學習筆記----day04Node.js筆記
- Node.js stream(流) 學習筆記(一)Node.js筆記
- Node.js 設計模式 學習筆記 之 流程式設計Node.js設計模式筆記程式設計
- 學習筆記之測試筆記
- Swoft 學習筆記之配置筆記
- Boltdb學習筆記之〇--概述筆記
- flask學習筆記之blueprintFlask筆記
- JS學習筆記之this指向JS筆記
- Java學習筆記之staticJava筆記
- oracle之awr學習筆記Oracle筆記
- Web之http學習筆記WebHTTP筆記
- Node基礎知識點--學習筆記(一)筆記
- <node.js學習筆記(完)>pug,mongodb命令(之後是node的案例,一個部落格)Node.js筆記MongoDB
- 《筆記》之學習高併發筆記
- Vue(1)之—— Vuex學習筆記Vue筆記
- swoft 學習筆記之 response 篇筆記
- JVM學習筆記之棧區JVM筆記
- hive學習筆記之十一:UDTFHive筆記
- Golang學習筆記之方法(method)Golang筆記
- 學習筆記:DOM之appendChild筆記APP