node 學習筆記 基礎入門
網址
-
官網
- https://nodejs.org
-
中文文件
- http://www.nodeclass.com/api/node.html
nodejs
什麼是nodejs:
是構建在 Chromes V8 引擎上 js 的執行環境,可以解析javaScript 程式碼。
javaScript 可以脫離瀏覽器執行,歸功於node.js
事件驅動,非阻塞I/O 模型 (非同步)
nodejs npm 是世界上最大的開源生態系統 javaScript 絕大多數包存放在npm 上
-
Node.js可以做什麼
沒有 BOM DOM
就是沒有window 和 document
web 伺服器後臺
命令列工具
npm (node)
hexo (node)
git (c)
-
B/S 程式設計模型
Browser - Server
任何伺服器端技術都是BS程式設計模型都是一樣,和語言無關、
Node 只是作為我們學習BS的工具而已
-
模組化程式設計
RequireJS
SeaJS
-
Node常用的API
-
非同步程式設計
回撥函式
Promise
async
generator
-
Ecmascript 6
-
瀏覽器中的javaScript 沒有檔案操作=能力的e
-
在node 中 的JavaScript具有檔案操作能力的
- 新建一個domo
- npm init -y
- npm i mongoose
- …
npm
-
建立node_mudules 檔案
npm init -y
設定預設 node_moduo路徑
-
檢視當親路徑
npm config get prefix
-
設定默路徑
C:\Users\小毅\AppData\Roaming\npm
新建專案
- npm init -y
- npm install express
- node app.js
檔案操作
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-4Fltij3b-1602604164981)(D:\2020\NoBook\img\image-20200518222600778.png)]
-
檔案操作路徑
//在檔案操作中的相對路徑 ./data/a.txt 相對於當前目錄 data/a.txt 相對於當前目錄 /data/a.txt 絕對路勁,當前檔案模組所處的磁碟根目錄 c:/xx/xxx... 絕對路徑
-
模組操作路徑
// 相對路徑 require('./data/app.js') // 如果忽略了 . 則是磁碟根目錄 require('/data/app.js')
-
利用 require 方法引入 fs 核心模組
var fs = require('fs')
-
檔案的讀取
fs.readFile('hello.txt',function(error,data){ if(error){ console.log(data); console.log(data.toString()); }
-
檔案的性質
//檔案是以 二進位制資料儲存的 fs.readFile 讀取出來的資料是16進位制 //可以通過toString()方法轉化我們我熟悉的漢字
-
檔案的寫入
// 利用fs.writeFile()方法在檔案寫入資料 fs.writeFile('./hello.txt',data,function(error){ if(error){ console.log('檔案寫入失敗'); }else{ console.log("檔案寫入成功"); }
檔案讀取 FIleReader
-
javascript 內建函式
var reader = new FileReader(); reader.readASDataURL('檔案'); reader.onload = function(){ console.log(reader.result); }
http 服務
- 案例
/*
* 載入http核心模組
var http =require('http');
* 建立一個Server例項
var server = http.createServer();
* 建立一個request 請求事件
*/
//載入http 核心模組
var http = require('http');
//建立一個Server 例項
var server = http.createServer();
//註冊request 請求事件
//當客戶端請求過來,就會自動觸發伺服器的request 請求事件,然後執行
//回撥函式的兩個引數
// request 請求物件,反映客戶端的一些請求資訊,例如請求路徑
// response 響應物件,給客戶端傳送響應資訊
server.on('request',function(request,response){
if(request.url=='/'){
response.write("hello,I am xiaoYi, welcome to index page");
}else if (request.url == '/login'){
response.write('hello ,welcome to login page');
}else{
response.write('sorry,is not found');
}
response.end();
})
// 繫結埠號,啟動伺服器
server.listen(3002,function(){
console.log("伺服器啟動經理撒附近成功了,可以通過http://127.0.0.1 來訪問!");
})
-
字串的兩種方法
JSON.parse() 將字串轉換為陣列 JSON.stringify() 陣列轉換為字串
-
核心模組
Node 為JavaScript提供了很多的伺服器級別的API 例如檔案操作的fs核心模組,http 服務構建的http模組,os 作業系統模
-
OS 核心模組
檢視cpu 資訊 os.cups() 檢視記憶體資訊 os.totalmen()
nodemon
nodemon 是一個第三方模組工具,可以幫我們解決頻繁修改程式碼重啟伺服器的問題
nodemon 是一個基於Node.js 開發的一個第三方命令列工具,需要獨立安裝
-
安裝
npm install -g nodemon
-
檢視版本號
nodemon --version
-
如果檢視版本號錯誤 ,則設定 npm 的環境變數
-
檢視預設路徑
npm config get prefix
-
設定環境變數
C:\Users\小毅\AppData\Roaming\npm //npm 預設的路徑
-
-
使用
node app.js // 使用nodemon // 只要通過nodemoe 啟動的服務,它會監聽你的檔案變化,當檔案發生變化,自動幫你重啟服務 nodemon app.js
Express
-
功能,通過app.get() 方法,根據不同的請求,執行回撥函式
-
安裝
npm install --save express
-
起步 Express 靜態服務
//安裝 //引包 var express = require ('express'); //建立伺服器應用程式 var app = express(); //當伺服器收到get 請求時 / 的時候,執行回撥函式 app.get('/',function(req,res){ res.send("hello express!"); }) app.get('/index.html',function(req,res){ res.send('你好,這就是index.html 頁面'); }) //公開指定目錄 app.use('/public/',express.static('./public/')) //設定監聽埠 app.listen(3001,function(){ console.log('app is running at port 3001') })
-
靜態服務
//直接訪問public 的檔案 app.use(express.static('public')) // 在要訪問的檔案前 + '/public/' app.use('/public',express.static('public')) //在要訪問的檔案前 + '/public/a/b/' app.use('/public/a/b/',express.static('/public'))
安裝 配置 art- template 模板引擎
-
安裝配置
npm install --save art-template npm install --save express-art-template // 同時安裝 npm install --save art-template express-art-template //第一個引數用來配置檢視的字尾名,這裡是.art 則儲存在views 目錄中的模板檔案必須是 .art 檔案 //預設字尾是 .art app.engine('art',require('express-art-tempalate')) //修改模板檔案的字尾位 .html app.engine('html',require('express-art-template'))
-
修改預設
view
檢視 渲染儲存目錄app.set("views",目錄路徑)
-
使用
app.get('/',function(req,res){ //express 預設去專案中的views 目錄找index.html res.render('index.html',{ title:'Hello World' }) })
路由
-
路由
-
是一種對映關係
-
請求方法
-
請求路徑
- 請求處理函式
app .get('./login',函式) .get('./img/img1.jpg',函式) .get('./index.html',函式)
-
-
get
//當以GET 方法請求 / 的時候,執行對應的處理函式 app.get('/',function(req,res){ res.send('Hello World'); })
-
post:
//當以GET 方法請求 / 的時候,執行對應的處理函式 app.post('/',function(req,res){ res.send('Gpt a POST request') })
使用node操作mysql
-
安裝
npm install mysql
##MongoDB
-
連線資料庫
//資料庫連線 var mongoose = require('mongoose') mongoose.connect("mongodb://localhost:27017/study", {useNewUrlParser:true}, function(err){ if(err){ console.log('Connection Error:' + err) }else{ console.log('Connection success!') } })
-
連線資料庫 插入資料
var mongoose = require('mongoose'); //連線資料庫 mongoose.connect("mongodb://localhost/test", {useNewUrlParser:true}); mongoose.Promise = global.Promise; //建立一個模型 "Cat" 表名(集合) 有一個文件物件 name var Cat = mongoose.model('Cat',{name:String}); // 例項化一個 kitty 例項 var kitty = new Cat({name:'小毅'}); //持久化儲存 kitty 實列 kitty.save(function(err){ if(err){ console.log(err); }else{ console.log('儲存成功!'); } })
-
Schema 設計文件結構 新增約束 增加資料 查詢資料 刪除資料 更新資料
var mongoose = require("mongoose")
var Schema = mongoose.Schema
//連結資料庫
// 指定的資料庫不需要存在,當插入第一條資料之後,資料庫會被建立出
// MongoClient.connect('mongodb://localhost/test',{ useNewUrlParser: true }, function(err, db) {
// });
mongoose.connect("mongodb://localhost/test", {useNewUrlParser:true}, function(err){
if(err){
console.log('Connection Error:' + err)
}else{
console.log('Connection success!') }
})
//設計文件結構 (表結構)
//約束的目的是為了保證資料的完整性,不要有髒資料
var userSchema = new Schema({
username:{
type:String,
required: true
},
password:{
type:String,
required:true
},
email:{
type:String
}
})
// 將文件結構釋出為模型
// mongoose.model方法就是用來將一個架構釋出為model
//第一個引數: 傳入一大寫名詞單詞字串用來表示資料庫的名稱
// mongoose 自動將大寫字串生成小寫複數形式的字串
//第二個引數: 模型建構函式
// 返回值:模型建構函式
var User = mongoose.model('User',userSchema)//第一個引數是集合名,第二個引數是文件結構模型
//增加資料
// var admin = new User({
// username: "小毅",
// password: "12346",
// email: "183@qq.com"
// })
// admin.save(function(err,ret){
// if(err){
// console.log('儲存失敗')
// }else{
// console.log('儲存成功')
// console.log(ret)
// }
// })
//查詢資料
// console.log('====================查詢全部===========================');
// User.find(function(err,ret){
// if(err){
// console.log('查詢失敗');
// }else{
// console.log(ret);
// }
// })
// console.log('====================條件查詢===========================');
// User.find({
// username:'小毅'
// },function(err,res){
// if(err){
// console.log('查詢失敗');
// }else{
// console.log(res);
// }
// })
// console.log('====================條件查詢 單個資料 返回的是物件===========================');
// User.findOne({
// //如果沒有條件,那麼返回的是第一個資料
// //如果有條件,但是不滿足條件,則返回 null
// username:"admin"
// },function(err,rep){
// if(err){
// console.log(err)
// }else{
// console.log(rep)
// }
// })
// console.log('====================刪除資料===========================');
// User.remove({
// username:'admin'
// },function(err,res){
// if(err){
// console.log('刪除失敗');
// }else{
// console.log('刪除成功');
// }
// })
console.log('====================更新資料===========================');
//第一個引數是資料的 id 號
//第二個引數是要修改的內容
//第三個引數是回撥函式
User.findByIdAndUpdate('5ebea52f357688299882fd17',{
password:'helloXiaoYi'
},function(err,rep){
if(err){
console.log('更新失敗');
}else{
console.log('更新成功'+rep);
}
})
mongoose-sex-page資料分頁
-
安裝使用
//安裝 npm install mongoose-sex-page //匯入mongoose-sex-page第三方模組 const pagination = require('mongoose-sex-page') //使用 let articles = await pagination(Artical).find().page(1),size(2).display(3).populate('author').exec()
-
引數說明:
- page指定當前頁
- size指定每頁顯示的資料條數
- display 指定客戶端要顯示的頁碼數量
- exec 向資料庫中傳送查詢請求
-
返回的資料 articles 的內容
{ "page": 1, //當前頁 "size": 2, //每頁顯示的條數 "total": 1, //總共的資料條數 "records": [{ //查詢出來的具體資料 "cover": "\\uploads\\upload_21bbd47e2ad7af6b07155f69f497bc46.gif", "_id": "5ed9fd90245b563bf8455a98", "title": "測試", "author": { "state": 0, "_id": "5ecb59b9bb6655338ce4ae71", "username": "小毅", "email": "183@qq.com", "password""$2b$10$kri4nln1Qrbjh/nvO8i6BeHKG3JTmcILfwXpZ.49A1XeUEaEEiZoa", "role": "normal", "__v": 0 }, "publishDate": "2020-06-05T08:08:48.510Z", "content": "<p>代發發的發不發</p>", "__v": 0 }], "pages": 1, //總共頁數 "display": [1] //客戶端顯示的頁碼 }
Joi
-
Joi 是對javaScritpt物件的規則描述語言和驗證器
-
下載
npm install joi //引入 Joi模組 const Joi = require('joi')
-
定義物件的驗證規則
const Joi = require('joi'); // alpahnum() 表示字母或數字 const schema = { username:Joi.string().min(2).max(30).required().error(new Error('使用者名稱不通過')), password:Joi.string().regex(/^[a-zA-z0-9]{3,30}$/), access_token:[Joi.string(),Joi.number()], birthYear:Joi.number().min(1900).max(2020), email:Jon.string().emil() };
-
使用 Joi 規則驗證物件
async function run(){ //實施驗證 try{ await Joi.validate({username:'asf'},cheme) }catch(error){ console.log(error.message); } console.log('驗證通過'); } run();
獲取表單post 請求體資料 body - parser
-
安裝
npm install --save body-parser
-
配置
var express = require('express') var bodyParse = require('body-parser'); var app = express() //配置 body-Parser //只要加入這個配置,則在res 請求物件就會多出來一個物件:body //也就是說可以直接通過req.body來獲取post 請求資料 //par application/X-www-form-urlencode app.use(bodyParser.urlencoded({extended:false})) //parse application/json app.use(bodyParser.json())
-
使用
app.use(function(req,res){ // 配置好bade-Parser 後,那麼在請求體裡就會多一個 body 物件,儲存的是 post請求的資料 console.log(req.body) })
-
bodyPaser 只能傳遞普通表單的資料,不能傳遞客戶傳遞的二進位制資料可以使用formidable
formidable
-
作用:
- 解析表單
- 支援get post 請求引數
- 檔案上傳
-
使用
//下載 formidable 模組 npm install formidable //引入formidabel 第三方模組 const formidable = require('formidable'); //引入 path 第三方模組 const path = require('path'); module.exports = (req,res) =>{ // 1、 建立表單解析物件 const form = new formidable.IncomingForm(); // 2、 配置上傳檔案的存放路徑 form.uploadDir = path.join(__dirname,'../','../','public','uploads') // 3、 保留上傳檔案的字尾 form.keepExtensions = true // 4、 解析表單 form.parse(req,(err,fields,files)=>{ // 1 err 錯誤對像,若失敗 err為錯誤資訊 若成功 err為null // 2 fields 物件型別 儲存普通表單資料 // 3 files 物件型別 儲存和檔案上傳的相關資料 res.send(files) }) }
form 表單
-
method = " "請求方法
-
action =" " 請求地址
-
enctype =" " 指定表單資料的編碼型別
-
application/x-www-form-urlcoded
name=zhansan&age=18
-
multipart/form-data
將表單資料編碼成二進位制型別
-
dateformat
-
dateformat 時間格式
-
使用
npm install dateformat //引入dateformat 第三方模組 返回一個方法 const dateFormat = require('dateformat') //全域性配置 dateformat //匯入art-template 模板引擎 const template = require("art-template") //向模板內部匯入dateFormate變數 template.defaults.imports.dateFormat =dateFormat; //使用 string1要格式化的時間 string2 要格式化成什麼格式 "yyyy-mm-dd" dateFormat(string1,string2)
回撥函式
-
目的是獲取函式中非同步操作的結果,必須通過回撥函式來獲取
-
呼叫 fn() ,得到內部的data
//宣告 fn function fn(callback){ setTimeout(function(){ var data = 'hello' callback(data) },1000) } //呼叫 fn fn(function(data){ console.log(data) })
密碼加密
-
密碼加密 bcrypt ,單程加密方式
//匯入模組 const bcrypt = require('bcrypt'); // 隨機生成字串, gen == > generate生成鹽 let salt = awit bcrypt.genSalt(10); //使用隨機字串對密碼加密 let pass = await bcrypt.hash('明文密碼',salt); let iavarable = bcrypt.compare("數入的密碼 ","密文密碼")
-
bcrypt 依賴的其他環境
1.python 2.x 2.node-gyp npm install -g node-gyp 3.windows-build-tools npm install --global --production windows-build-tools
-
安裝 bcrypt
// 管理員模式下 的 powerShell npm install bcrypt
的結果,必須通過回撥函式來獲取
-
呼叫 fn() ,得到內部的data
//宣告 fn function fn(callback){ setTimeout(function(){ var data = 'hello' callback(data) },1000) } //呼叫 fn fn(function(data){ console.log(data) })
密碼加密
-
密碼加密 bcrypt ,單程加密方式
//匯入模組 const bcrypt = require('bcrypt'); // 隨機生成字串, gen == > generate生成鹽 let salt = awit bcrypt.genSalt(10); //使用隨機字串對密碼加密 let pass = await bcrypt.hash('明文密碼',salt); let iavarable = bcrypt.compare("數入的密碼 ","密文密碼")
-
bcrypt 依賴的其他環境
1.python 2.x 2.node-gyp npm install -g node-gyp 3.windows-build-tools npm install --global --production windows-build-tools
-
安裝 bcrypt
// 管理員模式下 的 powerShell npm install bcrypt
相關文章
- node基礎學習筆記筆記
- Golang 基礎入門筆記Golang筆記
- 組合語言零基礎入門學習筆記(一)組合語言筆記
- Python基礎入門筆記(二)Python筆記
- Python基礎入門筆記(一)Python筆記
- vue 基礎入門筆記 09Vue筆記
- vue 基礎入門筆記 10Vue筆記
- vue 基礎入門筆記 11Vue筆記
- vue 基礎入門筆記 12Vue筆記
- vue 基礎入門筆記 13Vue筆記
- vue 基礎入門筆記 14Vue筆記
- vue 基礎入門筆記 15Vue筆記
- vue 基礎入門筆記 06Vue筆記
- vue 基礎入門筆記 07Vue筆記
- vue 基礎入門筆記 08Vue筆記
- vue 基礎入門筆記 03Vue筆記
- vue 基礎入門筆記 04Vue筆記
- vue 基礎入門筆記 05Vue筆記
- vue 基礎入門筆記 01Vue筆記
- vue 基礎入門筆記 02Vue筆記
- HTML基礎快速入門筆記HTML筆記
- git入門學習筆記Git筆記
- Docker入門學習筆記Docker筆記
- Unity學習筆記--入門Unity筆記
- TS入門學習筆記筆記
- 【PostgreSQL】入門學習筆記SQL筆記
- CSS 基礎學習筆記CSS筆記
- Python基礎學習筆記Python筆記
- Java基礎學習筆記Java筆記
- Web基礎學習筆記Web筆記
- vue 基礎入門筆記 15:refVue筆記
- vue 基礎入門筆記 11:元件Vue筆記元件
- JavaScript入門指南(學習筆記) 兩萬餘字的基礎總結JavaScript筆記
- JavaScript入門學習學習筆記(上)JavaScript筆記
- Linux基礎學習-Docker學習筆記LinuxDocker筆記
- JDK學習基礎入門(一)JDK
- HTML入門學習筆記(二)HTML筆記
- React入門指南(學習筆記)React筆記