- 基本代碼塊
// 按node-http-server回車則自動(dòng)創(chuàng)建好了一個(gè)nodejs的web應(yīng)用程序
var http = require('http'); // 表示引入http模塊
http.createServer(function (request, response) {
// request表示客戶端傳過來的信息普泡;response表示給客戶端響應(yīng)的信息
response.writeHead(200, {'Content-Type': 'text/html;charset=UTF-8'}); // 設(shè)置響應(yīng)頭
response.write("你好世界")
response.end('你好 World'); // 表示給頁面輸出一句話并且結(jié)束響應(yīng)
}).listen(8081); // 端口
console.log('Server running at http://127.0.0.1:8081/');
2.自定義模塊
(1)CommonJS(Nodejs)中自定義模塊的規(guī)定
①我們可以把公共的功能抽離成為一個(gè)單獨(dú)的js文件作為一個(gè)模塊,默認(rèn)情況下這個(gè)模塊里面的方法或?qū)傩酝饨缡菦]法訪問的。如果要讓外界可以訪問娩贷,則必須在模塊里面通過exports或module.exports暴露屬性或方法峭判。
②在需要使用這些模塊的文件中通過require的方式引入這個(gè)模塊即可使用。
(2)引入node_modules下的文件時(shí)粒褒,可以不寫完整其路徑,只寫在node_modules下的路徑诚镰。
包
(1)Nodejs中除了他自己提供的核心模塊外奕坟,也可以自定義模塊,也可以使用第三方模塊清笨。Nodejs中第三方模塊由包組成月杉,可以通過包來對一組具有相互依賴關(guān)系的模塊進(jìn)行統(tǒng)一管理。
(2)完全符合CommonJs規(guī)范的包目錄一般包含如下這些文件:
①package.json:包描述文件
②bin:用于存放可執(zhí)行二進(jìn)制文件的目錄
③lib:用于存放JavaScript代碼的目錄
④doc:用于存放文檔的目錄
(3)在Nodejs中用NPM命令來下載第三方的模塊(包)抠艾。
當(dāng)在項(xiàng)目中引入包時(shí)苛萎,最好是用npm install xxx --save,這樣就會(huì)在package.json中增加相應(yīng)的包版本信息检号,當(dāng)別人拉取代碼時(shí)即可根據(jù)npm下載該包(最新版的node加不加都可)腌歉。
指定下載的包的版本:npm install xxx@版本號 --savepackage.json
(1)創(chuàng)建package.json:npm init 或 npm init -yes
(2)dependencies里面保存的是項(xiàng)目所需要的一些包;devDependencies里面保存的是項(xiàng)目所需要的其他包齐苛,主要放的是一些工具(npm install xxx --save-dev)翘盖。
(3)
"md5": "^2.3.4"
// ^表示第一位版本號不變,后面兩位取最新凹蜂;
// ~表示前兩位不變馍驯,最后一個(gè)取最新;
// *表示全部取最新
- fs模塊的使用
(1)fs.stat():檢測是文件還是目錄
// 引入fs模塊
var fs = require('fs')
// fs.stat 檢測目標(biāo)是文件還是目錄
fs.stat('./html',(err,data)=>{
if(err){
console.log(err)
}
console.log(`是文件:${data.isFile()}`)
console.log(`是目錄:${data.isDirectory()}`)
})
(2)fs.mkdir():創(chuàng)建目錄
三個(gè)參數(shù):①path 將創(chuàng)建的目錄路徑玛痊;②mode 目錄權(quán)限(讀寫權(quán)限)汰瘫;③callback 回調(diào),傳遞異常參數(shù)err
fs.mkdir('./css',err=> {
if(err) {
console.log(err)
}
console.log('創(chuàng)建成功')
})
(3)fs.writeFie() 創(chuàng)建寫入文件
若文件不存在擂煞,則直接創(chuàng)建寫入混弥,若文件存在,則直接替換文件內(nèi)容颈娜。
fs.writeFile('./html/index.html','你好nodejs',(err)=> {
if(err) {
console.log(err)
}
console.log('創(chuàng)建寫入文件成功')
})
(4)fs.appendFile() 追加文件剑逃,用法與fs.writeFie()類似
(5)fs.readFile() 讀取文件
fs.readFile('./html/index.html',(err,data)=> {
if(err) {
console.log(err)
}
console.log('讀取文件成功',data) // 直接讀取的是二進(jìn)制的Buffer文件
console.log(data.toString()) // 將Buffer轉(zhuǎn)化成string類型
})
(6)fs.readdir() 讀取目錄浙宜,與fs.readFile() 用法類似
(7)fs.rename() 功能:重命名;移動(dòng)文件
// 重命名功能
fs.rename('./html/index.html','./html/index1.html',err=> {
if(err) {
console.log(err)
}
console.log('重命名成功')
})
// 移動(dòng)文件功能
fs.rename('./html/index1.html','./css/index1.html',err=> {
if(err) {
console.log(err)
}
console.log('移動(dòng)文件成功')
})
(8)fs.mkdir() 刪除目錄
(9)fs.unlink() 刪除文件
(10)
①案例一
// 1. 判斷服務(wù)器上有沒有upload目錄蛹磺,沒有則創(chuàng)建粟瞬,有則不做操作
const fs = require('fs');
fs.stat('./upload',(err,data)=> {
if(err) {
console.log('upload目錄不存在,要?jiǎng)?chuàng)建upload目錄')
mkdir('./upload')
}
else if(data.isDirectory()){
console.log('upload目錄存在')
} else {
console.log('upload文件存在萤捆,但upload文件夾不存在裙品,仍要?jiǎng)?chuàng)建upload目錄')
// 首先刪除upload文件(不包括upload.html等有后綴名的文件),再創(chuàng)建文件夾
fs.unlink('./upload',err=> {
if(!err) {
mkdir('./upload')
}
else {
console.log('請檢查傳入的文件是否正確')
}
})
}
})
function mkdir(dir) {
fs.mkdir(dir,err=> {
if(err) {
console.log()
}
console.log('創(chuàng)建目錄成功')
})
}
②案例二
// 2. wwwroot文件夾下有images html css js以及index.html俗或,找出wwwroot目錄下面所有的目錄市怎,然后放在一個(gè)數(shù)組中
const fs = require('fs')
// 注意:錯(cuò)誤的寫法如下,打印出的兩個(gè)dirArr都是空
var path = './wwwroot'
var dirArr = []
fs.readdir(path,(err, data)=> {
if(err) {
console.log(err)
}
for(var i=0;i<data.length;i++) {
// fs模塊方法是異步的,所以在for循環(huán)結(jié)束后才執(zhí)行fs方法辛慰,此時(shí)data[4]不是文件夾区匠,故dirArr值為空
fs.stat(path+'/'+data[i],(err,stats)=> {
if(err) {
console.log(err)
}
else if(stats.isDirectory()) {
dirArr.push(data[i])
}
})
}
console.log(dirArr)
})
console.log(dirArr)
// 改正:1. 改造for循環(huán),遞歸實(shí)現(xiàn)(如下帅腌,但可讀性差)
var path = './wwwroot'
var dirArr = []
fs.readdir(path,(err, data)=> {
if(err) {
console.log(err)
return;
}
// 立即執(zhí)行函數(shù)
(function getDir(i){
if(i==data.length) {
// 執(zhí)行完成
console.log(dirArr);
return; // return必須加上驰弄,否則報(bào)錯(cuò)
}
fs.stat(path+'/'+data[i],(err,stats)=> {
if(err) {
console.log(err)
}
else if(stats.isDirectory()) {
dirArr.push(data[i])
}
getDir(i+1) //遞歸調(diào)用
})
})(0)
})
(11)fs.createReadStream 從文件流中讀取數(shù)據(jù)
// 以流的方式讀取數(shù)據(jù)是一點(diǎn)點(diǎn)讀取的
const fs = require('fs')
var readStream = fs.readStream('./data/output.txt');
var count = 0
var str = '';
readStream.on('data',(data)=> { // 監(jiān)聽讀取狀態(tài)
str+=data;
count++;
})
readStream.on('end',(data)=> { // 當(dāng)為end時(shí)結(jié)束
console.log(str)
console.log(count)
})
readStream.on('err',(data)=> { // 監(jiān)聽錯(cuò)誤信息
console.log(err)
})
(12)fs.createWriteStream 從文件流中讀取數(shù)據(jù)
const fs = require('fs')
var str = ''
for(var i=0;i<500;i++) {
str += 'bjyxszd!\n';
}
var writeStream = fs.createWriteStream('./data/input.txt')
writeStream.write(str);
writeStream.end(); // 標(biāo)記文件末尾
writeStream.on('finnish',()=> { // 監(jiān)聽寫入完成
console.log('寫入完成')
})
(13)管道流
定義:管道流用于讀取一個(gè)文件內(nèi)容并將內(nèi)容寫到另外一個(gè)文件中
const fs = require('fs');
var readStream = fs.createReadStream('./aaa.jpg')
var writeStream = fs.createWriteStream('./data/aaa.jpg')
readStream.pipe(writeStream)
// 原文件仍存在
路由
定義:路由是由一個(gè)URL(或者叫路徑)和一個(gè)特定的HTTP方法(GET、POST等)組成的速客,涉及到應(yīng)用如何響應(yīng)客戶端對某個(gè)網(wǎng)站節(jié)點(diǎn)的訪問戚篙。即針對不同請求的URL處理不同的業(yè)務(wù)邏輯。EJS模塊引擎
定義:EJS是后臺(tái)模板溺职,可以把我們數(shù)據(jù)庫和文件讀取的數(shù)據(jù)顯示到html頁面上岔擂。它是一個(gè)第三方模塊,需要通過npm安裝浪耘。