JavaScript 語言自身只有字符串數據類型,沒有二進制數據類型。javascript
但在處理像TCP流或文件流時,必須使用到二進制數據。所以在 Node.js中,定義了一個 Buffer 類,該類用來建立一個專門存放二進制數據的緩存區。php
實例化html
Buffer.from(array)java
Buffer.from(string)node
Buffer.alloc(size)linux
功能方法(靜態方法:經過類名調用.)web
Buffer.isEncoding() 判斷是否支持該編碼ajax
Buffer.isBuffer() 判斷是否爲Bufferexpress
Buffer.byteLength() 返回指定編碼的字節長度,默認utf8npm
Buffer.concat() 將一組Buffer對象合併爲一個Buffer對象
實例方法
write() 向buffer對象中寫入內容
slice() 截取新的buffer對象
toString() 把buf對象轉成字符串
toJSON() 把buf對象轉成json形式的字符串:
不須要顯式調用,當JSON.stringify()方法調用時會自動調用toJSON方法。
let buf=Buffer.from('hello');
let json=JSON.stringify(buf);
console.log(json);
先引入路徑模塊:
const path=require('path')
;
[path.basename(path, ext]):返回文件名稱
path.dirname(path):返回路徑
path.extname(path):返回擴展名
path.format(pathObject):將一個pathObject轉化爲一個字符串路徑
path.parse(path):將一個字符串路徑轉化爲路徑對象
path.isAbsolute(path):判斷是否爲一個絕對路徑。
(2)blobal超全局對象下的兩個方法:
__dirname:返回當前文件所在位置的目錄;
__filename:返回當前文件所在位置的全路徑.
// 拼接路徑(..表示上層路徑;.表示當前路徑),在鏈接路徑的時候會格式化路徑
// console.log(path.join('/foo', 'bar', 'baz/asdf', 'quux', '../../'));
// 規範化路徑
// console.log(path.normalize('/foo/bar//baz/asdf/quux/..'));
// console.log(path.normalize('C:\\temp\\\\foo\\bar\\..\\'));
// 計算相對路徑
// console.log(path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb'));
// console.log(path.relative('C:\\orandea\\test\\aaa', 'C:\\orandea\\impl\\bbb'));
// 解析路徑
// console.log(path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif'));
// 兩個特殊屬性
console.log(path.delimiter);//表示路徑分隔符(windows是\ Linux是/)
console.log(path.sep);//環境變量分隔符(windows中使用; linux中使用:)
異步與同步:
因而,全部任務能夠分紅兩種,一種是同步任務(synchronous),另外一種是異步任務(asynchronous)。同步任務指的是,在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行後一個任務;異步任務指的是,不進入主線程、而進入"任務隊列"(task queue)的任務,只有等主線程任務執行完畢,"任務隊列"開始通知主線程,請求執行任務,該任務纔會進入主線程執行。
js在瀏覽器中執行存在的異步操做: 定時任務 事件處理 ajax回調處理。
node.js 中的異步執行任務:文件I/O 網絡I/O
引入模塊: const fs=require('fs');
fs.stat(param1,param2)
param1:文件路徑 param2: 回調函數 ( err,stats)兩個參數都爲對象,stats.isDirectory:判斷是否爲路徑
stats.isFile:判斷是否爲文件。 屬性:ctime:文件狀態發生改變時間,如權限 mtime:數據改變時間 atime:訪問時間 birthtime:文件創造時間。
return null3.readFile()和writeFile();
/*讀文件操做*/
const fs=require('fs');
const path=require('path');
let strpath=path.join(__dirname,'data.json');
/*異步方式*/
fs.readFile(strpath,(err,data)=>{
if(err) return;
console.log(data.toString());
});
/*同步方式*/
console.log(fs.readFileSync(strpath).toString());
/*寫文件操做*/
let buf=Buffer.from('hello');
fs.writeFile(strpath,buf,'utf8',(err)=>{
if(!err){
console.log('寫入成功');
}
})
4.大文件的流式操做:
/*大文件的流式操做*/
const path=require('path');
const fs =require('fs');
let spath =path.join(__filename);
let endPath=path.join('C:\\Users\\Administrator\\Desktop','file.js');
let readStream=fs.createReadStream(spath);
let writeStream=fs.createWriteStream(endPath);
/*基於事件的處理方式*/
/*let num=0;
chunk:數據塊
readStream.on('data',(chunk)=>{
num++;
writeStream.write(chunk);
});
readStream.on('end',()=>{
console.log('文件處理完成'+num);
});
*/
// pipe():直接將輸入流鏈接到輸出流 pipe:管道
readStream.pipe(writeStream);
/*目錄操做*/
const path=require('path');
const fs=require('fs');
/*建立目錄*/
// fs.mkdir(path.join(__dirname,'abc'),(err)=>{
// console.log(err);
// });
/*同步建立目錄*/
// fs.mkdirSync(path.join(__dirname,'def'));
/*刪除目錄*/
// fs.rmdir(path.join(__dirname,'def'),(err)=>{})
//讀取目錄
fs.readdir(__dirname,(err,files)=>{
files.forEach((item,index)=>{
fs.stat(path.join(__dirname,item),(err,stat)=>{
if(stat.isFile()){
console.log(item+"文件");
}else if(stat.isDirectory()){
console.log(item+"目錄");
}
});
});
});
npm: node.js package management (全球最大的模塊生態系統,也是node.js的包管理工具。)
npm全局安裝(安裝包在node.js環境的modules目錄下,通常用於命令行工具)
安裝包: npm install -g 包名稱@版本 (全局安裝) 本地安裝則不須要 參數 g
更新包 npm update 包名稱
刪除包: npm uninstall 包名稱
npm清除緩存:pm cache clean --force
3.npm本地安裝:
初始化包 npm init -y (1) 運行 node (2)指定pakage.json中test值 npm run test 執行
添加依賴 : 開發環境 安裝包的同時 末尾加上 --save
生產環境:安裝包的同時 末尾加上 --save-dev
已有package.json中的dependencies 安裝直接 npm install production
已有DevDependencies 安裝直接 npm install
4.yarn工具的安裝:
yarn工具基本使用
安裝yarn工具:npm install -g yarn
一、初始化包
npm init
yarn init
二、安裝包
npm install xxx --save
yarn add xxx
三、移除包
npm uninstall xxx
yarn remove xxx
四、更新包
npm update xxx
yarn upgrade xxx
五、安裝開發依賴的包
npm install xxx --save-dev
yarn add xxx --dev
六、全局安裝
npm install -g xxx
yarn global add xxx
七、設置下載鏡像的地址
npm config set registry url
yarn config set registry url
八、安裝全部依賴
npm install
yarn install
九、執行包
npm run
yarn run
5.自定義包:
若是嚴格按照規範來講 包目錄應包含如下文件或目錄
package.json:包描述文件
bin:存放可執行二進制文件的目錄
lib:存放js代碼的目錄
doc:存放文檔的目錄
test:存放單元測試用例代碼的目錄
(1)區別:
傳統的動態網站開發須要應用軟件
PHP : Apache + php模塊
java :Tomcat 、Weblogic
Node.js : 不須要應用軟件(能夠本身實現)
(2)
/*簡單實現服務器功能*/
const http=require('http');
// 建立服務器實例對象
let server=http.createServer();
/*綁定請求事件*/
server.on('request',(req,res)=>{
res.end('hello');
});
// 監聽端口號
server.listen(3000);
// 簡單寫法:
http.createServer((req,res)=>{
res.end('welcome to this');
}).listen(3000,'192.168.229.1',()=>{
console.log('running...');
});
- 處理get方式請求參數:
- ```javascript
處理get請求方式參數:
(1) const url=require('url');
(2) let param=url.parse(req.url,true).query
處理post方式參數:
const querystring = require('querystring');
let pdata='';
req.on('data',(chunk)=>{
pdata+=chunk;
});
req.on('end',()=>{
//定義一個存放post發送請求請求體內容的對象。
let obj=querystring.parse(pdata);
})
art-template的使用:
/*art-template的使用*/
var template = require('art-template');
/*第一種使用方法*/
/*var html = template(__dirname + '/mytpl.art', {
user: {
name: '汪龍',
age:'18',
hometown:"lantian"
}
});
console.log(html);*/
/*方法2*/
let tpl =`{{if user}}
<h2>{{user.name}}</h2>
<h2>{{user.age}}</h2>
<h2>{{user.hometown}}</h2>
{{/if}}'`;
let tpl2=`
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>成績結果</title>
</head>
<body>
<ul>
<li>語文:{{chinese}}</li>
<li>數學:{{math}}</li>
<li>英語:{{english}}</li>
<li>綜合:{{summary}}</li>
</ul>
</body>
</html>`;
let render=template.compile(tpl);
let ret=render({
user: {
name: '汪龍',
age:'18',
hometown:"lantian"
}
});
console.log(ret);
// 方法3
let score= template.render(tpl2,{
chinese:'148',
math:'149',
english:'139',
summary:'289'
} );
console.log(score);
node.js web開發相關內容總結:
1.nodejs不須要第三方軟件,能夠本身實現服務器功能。
2.實現靜態資源分配
3.路由處理
4.動態網站
5.模板引擎
6.get和post參數處理
web開發框架:express.
實現簡單服務器測試
/*express測試*/
const express=require('express');
const app=express();
let server=app.get('/',(req,res)=>{
res.send('hello world');
});
server.listen(3000,'localhost',()=>{
console.log('running...');
});
靜態文件託管:
/*託管靜態文件*/
// 能夠指定虛擬目錄
// 能夠指定多個目錄
var express = require('express');
var app = express();
app.use(express.static('public'));
app.use(express.static('www'));
app.listen(3000,()=>{
console.log('running....');
});
路由處理:
/*路由(根據請求方式和請求路徑進行路徑分發處理)*/
/*
http經常使用請求方式:
1.get 查詢
2.post 添加
3. put 更新
4. delete 刪除
restful api(一種url格式)
*/
const express=require('express');
const app=express();
/*四種基本的路由請求方式*/
/*app.get('/',(req,res)=>{
res.send('get data');
});
app.post('/',(req,res)=>{
res.send('post data');
});
app.put('/',(req,res)=>{
res.send('put data');
});
app.delete('/',(req,res)=>{
res.send('delete data');
});*/
// 直接使用use能夠處理全部的路由請求分發
app.use('/',(req,res)=>{
res.send('hello');
});
app.listen(3000,()=>{
console.log('running....');
});
中間件(就是處理過程當中的一個環節(本質上至關於一個函數)):
// 中間件的掛載方式// use 路由(get post put delete);// next('route');跳轉到下一路由
const express=require('express');
const app=express();
let acessNum=0;
//監聽全部路徑
app.use('',(req,res,next)=>{
/*記錄訪問時間*/
console.log('哈哈,你怎麼又來看我了');
next()
});
app.use('/user',(req,res,next)=>{
/*記錄訪問時間*/
console.log(Date.now());
next()
});
app.use('/user',(req,res,next)=>{
/*記錄訪問日誌*/
console.log('welcome to this');
next()
});
app.use('/user',(req,res)=>{
/*記錄訪問次數*/
acessNum++;
console.log('訪問量:'+acessNum);
res.send('hello');
});
應用中間件:
//登陸驗證
/*中間件的應用,第3方中間件,body-parse的使用*/
const express=require('express');
const app=express();
const bodyParser = require('body-parser');
// 託管靜態資源
app.use(express.static('public'));
// 處理get請求方式參數
//掛載body-parser中間件
app.use(bodyParser.urlencoded({ extended: false }));
//當data爲json格式的時候須要加載下面代碼
//app.use(bodyParser.json())
app.get('/login',(req,res)=>{
// 經過req.query屬性得到get方式參數
let data=req.query;
if(data.username=='admin'&&data.password=='123'){
res.send('success');
}else{
res.send('failure');
}
});
//處理post請求、
app.post('/login',(req,res)=>{
let data=req.body;
console.log(data);
if(data.username=='admin'&&data.password=='123'){
res.send('success');
}else{
res.send('failure');
}
});
app.listen(3000,()=>{
console.log('running....');
});
express中使用art-template模板:
1.安裝包:
npm install --save art-template
npm install --save express-art-template
2.使用:
// 設置模板的路徑
app.set('views',path.join(__dirname,'views'));
// 設置模板引擎
app.set('view engine','art');
// 使express兼容art-template模板引擎
app.engine('art', require('express-art-template'));
// 參數一:模板名稱;參數二:渲染模板的數據
res.render('list',data);