nodejs
const http = require('http')
http.createServer((req,res) => {
console.log(req.url)
res.writeHead(200,{"Content-type":"text/html;charset='utf-8'"})
res.write('this is nodejs')
res.end()
}).listen(3000)
-
res.end()
一定要寫,否則瀏覽器將會進入無限加載的假死狀態(tài)禁添。 - 即使已經(jīng)寫了
charset='utf-8'"
但是仍然無法識別中文撮胧,需要像html一樣在前面加個<meta>標簽寫上UTF-8,例如:
res.write('<h2>你好this is nodejs</h2>') //浣犲ソthis is nodejs
res.write('<head> <meta charset="UTF-8"></head>')
res.write('<h2>你好this is nodejs</h2>') //你好this is nodejs
1.url模塊的使用
- 獲取用戶傳過來的參數(shù)
const url = require('url')
var api='http://www.itying.com?name=zhangsan&age=20'
console.log(url.parse(api,true)) //獲取用戶傳過來的參數(shù) query: [Object: null prototype] { name: 'zhangsan', age: '20' }
var temp = url.parse(api,true).query
console.log(temp) //[Object: null prototype] { name: 'zhangsan', age: '20' }
實現(xiàn)自定義模塊化:
1.我們可以把公共的功能抽離成為一個單獨的js 文件作為一個模塊,默認情況下面這個模塊里面的方法或者屬性老翘,外面是沒法訪問的芹啥。如果要讓外部可以訪問模塊里面的方法或者屬性,就必須在模塊里面通過exports或者module.exports 暴露屬性或者方法铺峭。
2.在需要使用這些模塊的文件中墓怀,通過 require的方式引入這個模塊。這個時候就可以使用模塊里面暴露的屬性和方法卫键。
myTry1.js文件:
function formatApi(api) {
return 'http://www.love.com/' + api
}
//兩種暴露方式
exports.formatApi = formatApi
module.exports = formatApi;
myTry.js文件:
const http = require('http')
//兩種引入的方法
const tools = require('./myTry1') //1.
const toos = require('./myTry1') //2.
console.log(tools) //{ formatApi: [Function: formatApi] }
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/html;charset="utf-8"'});
response.write("<head> <meta charset='UTF-8'></head>")
var api = tools.formatApi("api/plist")
response.write(api) //http://www.loveitying.com/api/plist
response.end();
}).listen(8081);
nodejs默認會找node_modules對應(yīng)模塊里面的index.js
2.包與NPM
Nodejs中除了它自己提供的核心模塊外傀履,我們可以自定義模塊,也可以使用第三方的模塊莉炉。Nodejs 中第三方模塊由包組成钓账,可以通過包來對一組具有相互依賴關(guān)系的模塊進行統(tǒng)一管理。
npm是世界上最大的開放源代碼的生態(tài)系統(tǒng)絮宁。我們可以通過npm下載各種各樣的包官扣,這些源代碼(包)我們可以在https://www.npmjs.com找到。
- 在項目的跟目錄下使用命令提示符輸入
npm init --yes
來下載package.json文件 - 加密處理例子:
npm install md5 --save
→
var md5 = require('md5')
md5('123456')
console.log(md5('123456')) //e10adc3949ba59abbe56e057f20f883e
- 指定包的版本:
npm install node-media-server@2.1.0 --save
- package.json中“dependencies”里面是需要安裝的包及包的信息羞福,可用
npm i
下載
3.fs模塊
- fs.stat 檢測是文件還是目錄
const fs = require('fs')
// fs.stat('路徑',回調(diào)函數(shù))
fs.stat('./html',(err,data) => {
if(err) {
console.log(err)
return
}
console.log(`是文件:${data.isFile()}`) //是文件:false
console.log(`是目錄:${data.isDirectory()}`) //是目錄:true
})
- fs.mkdir 創(chuàng)建目錄
const fs = require('fs')
// fs.mkdir('將要創(chuàng)建的目錄路徑',目錄權(quán)限(可不寫,默認777)蚯涮,回調(diào)函數(shù))
fs.mkdir('./css',(err) => {
if(err) {
console.log(err)
return
}
console.log('創(chuàng)建成功') //創(chuàng)建成功
})
- fs.writeFile 創(chuàng)建寫入文件
const fs = require('fs')
// 如果沒有該文件則創(chuàng)建該文件治专,如果已經(jīng)有此文件則作替換操作,即再次運行時把輸入內(nèi)容寫成‘嘻嘻’文件中內(nèi)容會變成‘嘻嘻’而不是‘你好nodejs嘻嘻’
fs.writeFile('./css/index.html','你好nodejs',(err) => {
if(err) {
console.log(err)
return
}
console.log('創(chuàng)建寫入文件成功') //創(chuàng)建寫入文件成功
})
- fs.appendFile 追加文件
const fs = require('fs')
// 如果沒有該文件則創(chuàng)建該文件遭顶,如果已經(jīng)有此文件則追加內(nèi)容张峰,由上個例子再次運行時把輸入內(nèi)容寫成‘嘻嘻’文件中內(nèi)容會變成‘你好nodejs嘻嘻’
fs.appendFile('./css/index.html','嘻嘻',(err) => {
if(err) {
console.log(err)
return
}
console.log('追加文件成功') //追加文件成功
})
- fs.readFile 讀取文件
const fs = require('fs')
fs.readFile('./css/index.html',(err,data) => {
if(err) {
console.log(err)
return
}
console.log(data) //<Buffer e4 bd a0 e5 a5 bd 6e 6f 64 65 6a 73 e5 98 bb e5 98 bb>
//十六進制的buffer類型
console.log(data.toString()) //你好nodejs嘻嘻
//將Buffer轉(zhuǎn)化成string類型
})
- fs.readdir 讀取目錄
const fs = require('fs')
fs.readdir('./css',(err,data) => {
if(err) {
console.log(err)
return
}
console.log(data) //[ 'font.html', 'index.html' ]
})
- fs.rename 重命名
const fs = require('fs')
// fs.rename(oldRoad,newRoad,callback) 功能:1.重命名 2.移動文件(可邊重命名邊移動)
//重命名
fs.rename('./css/index.html','./css/html.html',(err) => {
if(err) {
console.log(err)
return
}
console.log('重命名成功') //重命名成功
})
//移動文件
fs.rename('./css/html.html','./UIbutton/html.html',(err) => {
if(err) {
console.log(err)
return
}
console.log('移動文件成功') //移動文件成功
})
- fs.rmdir 刪除目錄
const fs = require('fs')
// fs.rename(oldRoad,newRoad,callback) 功能:1.重命名 2.移動文件
fs.rmdir('./css',(err) => {
if(err) {
console.log(err) //Error: ENOTEMPTY: directory not empty 目錄中還有其它文件,無法刪除棒旗,當(dāng)該目錄中沒有文件時即可刪除成功
return
}
console.log('刪除目錄成功')
})
- fs.unlink 別除文件
fs.unlink('./css/font.html',(err) => {
if(err) {
console.log(err)
return
}
console.log('刪除文件成功') //移動文件成功
})
4.fs模塊例子
- 判斷服務(wù)器上面有沒有upload目錄喘批。如果沒有創(chuàng)建這個目錄,如果有的話不做操作铣揉。
//方法一
const fs = require('fs')
let path = './upload'
fs.stat(path,(err,data) => {
if(err) {
mkdir(path)
return
}
if(!data.isDirectory()) {
//若有同名文件會報錯饶深,所以要首先刪除文件再去執(zhí)行創(chuàng)建目錄
fs.unlink(path,(err) => {
if(!err) {
mkdir(path)
} else {
console.log('請檢查傳入的數(shù)據(jù)是否正確')
}
})
}
})
function mkdir(dir) {
fs.mkdir(dir,(err) => {
if(err) {
console.log(err)
return
}
})
}
//方法二
//cnpm i mkdirp --asve
var mkdirp = require('mkdirp')
mkdirp('./upload',function(err) {
if(err) {
console.error(err)
}
})
mkdirp('./upload')
//可生成多個目錄
mkdirp('./upload/aaa/xxx',function(err) {
if(err) {
console.error(err)
}
})
- wwwroot文件夾下面有images css js以及index.html , 找出wwwroot目錄下面的所有的目錄,并將目錄push到數(shù)組中
const fs = require('fs')
//方法一
let dirArr = []
let path = './wwwroot'
fs.readdir(path,(err,data) => {
if(err) {
console.log(err)
return
}
//注意:fs.stat是異步方法逛拱,所以以下是錯誤方法
// for(let i = 0;i < data.length;i++) {
// fs.stat(path + '/' + data[i],(error,stats) => {
// if(stats.isDirectory()) {
// dirArr.push(data[i])
// }
// })
// }
(function getDir(i) {
if(i == data.length) {
console.log(dirArr) //[ 'css', 'img', 'js' ]
return
}
fs.stat(path + '/' + data[i],(error,stats) => {
if(stats.isDirectory()) {
dirArr.push(data[i])
}
getDir(i + 1)
})
})(0)
})
//方法二
async function isDir(path) {
return new Promise((resolve,reject) => {
fs.stat(path,(error,stats) => {
if(error) {
console.log(error)
return
}
if(stats.isDirectory()) {
resolve(true)
} else {
reject(false)
}
})
})
}
function main() {
let path = './wwwroot'
let dirArr = []
fs.readdir(path,async (err,data) => {
if(err) {
console.log(err)
return
}
for(let i = 0;i < data.length;i++) {
if(await isDir(path + '/' + data[i])) {
dirArr.push(data[i])
}
}
console.log(dirArr)
})
}
main()
5. fs.createReadStream從文件流中讀取數(shù)據(jù)
//讀取流
const fs = require('fs')
let readStream = fs.createReadStream('./xxx.txt')
var count = 0
var str = ''
readStream.on('data',(data) => {
str += data
count++
})
readStream.on('end',() => {
console.log(str)
console.log(count)
})
readStream.on('error',(err) => {
console.log(err)
})
//寫入流
const fs = require('fs')
var str = ''
for(var i = 0;i < 500;i++) {
str += 'lalala\n'
}
var writeStream = fs.createWriteStream('./xxx.txt')
writeStream.write(str)
// 標記寫入完成
writeStream.end()
writeStream.on('finish',() => {
console.log('寫入完成')
})
//管道流(復(fù)制文件
const fs = require('fs')
var readStream = fs.createReadStream('./aaa/QQ.png')
var writeStream = fs.createWriteStream('./bbb/QQ.png')
readStream.pipe(writeStream)