nodejs
作用
使用js 来写后台程序
目标
数据服务,文件服务,web服务
优势
性能高,方便、入门难度低、大公司都在用(BAT)
劣势
- 服务器提供的相对较少
- 相对其他语言,能用的上的学习资料少
- 对程序员的要求相对较高
注意
nodejs
使用的是ECMA
语法,不可使用DOM
,BOM
推荐命令行工具:supervisor
nodemon
安装方式: npm install supervisor -g
或npm install nodemon -g
前后端交互
我们需要引入 http模块
//http模块引入
const http = require("http")
//创建服务
const app = http.createServer((req,res) =>{
console.log("前端访问!!!")
//后端权重高 所以以后端为主
res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"})
res.write("后端传输过来的信息")
//后端响应结束 必须的
res.end()
})
//监听端口
app.listen(3000,"localhost",() =>{
console.log("server in running......")
})
我们写好代码后 使用cmd在当前路径下 输入nodemon +js文件名
即可执行js代码,之后我们打开浏览器在地址栏输入localhost: +你监听的端口号
即可访问
fs模块
磁盘操作,文件操作
一些fs 常见操作
let fs = require("fs") //引入了系统模块fs (进行文件相关操作)
//文件读取
//fs.readFile('地址',回调函数)
// fs.readFile("./html/index.html","utf-8",(err,data)=>{
// console.log("err",err) //如果文件读取成功,err就是null
// console.log("data",data) //data就是读取后的文件内容
// })
//fs.readFileSync
// let data = fs.readFileSync("./html/index.html")
// console.log("data",data)
// console.log("我要成功了!")
//后续发现文件如果报错了,后续的代码都不会去执行了!
//通过try-catch-finally语句块,使得后续代码正常执行。
// try{
// let data = fs.readFileSync("./html/indexa.html")
// console.log("data",data)
// }catch(e){ //e代表事件对象
// //处理错误
// console.log("e",e)
// }
// console.log("我要成功了!")
//改名
//fs.rename('改前','改后',err=>{})
//fs.renameSync("改前","改后")
// fs.renameSync("./html/index.html","./html/about.html")
//删除
// fs.unlinkSync('文件路径')
// fs.unlinkSync("./html/about.html")
// fs.unlink() 不能用于目录。 要删除目录,则使用 fs.rmdir()。
// fs.unlinkSync("./html")
fs.rmdir("./html",err=>{
console.log("html目录以及被删除了哦....")
})
我们可以使用fs模块
和http模块
来进行资源托管
//1.引入相应的原生模块、依赖
let http=require("http")
let fs=require("fs")
//2.实例化http对象(服务器对象)
// let app= http.createServer((req,res)=>{
// // console.log(req.url)
// if(req.url.indexOf("/favicon.ico") ===-1 ){
// if(req.url.indexOf("/api") !== -1){
// console.log("处理/api 开头的动态接口",req.url)
// }else{
// console.log("处理静态资源",req.url)
// }
// }
// res.end()
// })
// app.listen(3000)
//2.实例化http对象(服务器对象)
let app= http.createServer((req,res)=>{
// console.log(req.url)
//排除 /favicon.ico的请求
if(req.url.indexOf("/favicon.ico") ===-1 ){
//需要判断要读取的是动态资源(接口api)还是静态资源
if(req.url.indexOf("/api") !== -1){
console.log("处理/api 开头的动态接口",req.url)
}else{
//处理静态资源 /index.html
//1.if
// console.log("处理静态资源",req.url)
// console.log(req.url)
// let path;
// if(req.url === "/"){
// path = "/index.html"
// }else{
// path = req.url
// }
//2.三目运算符
// let path = req.url === "/" ? "/index.html" : req.url
// let html = fs.readFileSync("./www"+path)
//1.1 if
// let html = fs.readFileSync("./www"+req.url)
try{
let path = req.url === "/" ? "/index.html" : req.url
let html = fs.readFileSync("./www"+path)
res.write(html)
}
catch(error){
let html =fs.readFileSync("./www/nopage.html")
res.write(html)
}
}
}
res.end()
})
app.listen(3000)
url模块
作用
处理 url型的字符串
用法
url.parse(str,true) 返回 对象 true处理query为对象
str -> obj 返回 对象 true
protocol: ‘http:’, 协议
slashes: true, 双斜杠
auth: null, 作者
host: ‘localhost:8002’, 主机
port: ‘8002’, 端口
hostname: ‘localhost’, baidu
hash: ‘#title’, 哈希(锚)
search: ‘?username=sdfsdf&content=234234’, 查询字符串
query: ‘username=sdfsdf&content=234234’, 数据
pathname: ‘/aaa’, 文件路径
path: ‘/aaa?username=sdfsdf&content=234234’, 文件路径
href: ‘http://localhost:8002/aaa?username=sdfsdf&content=234234#title’
url.format(obj) 返回字符
obj -> str 返回str
let url = require("url")
let str = "http://www.baidu.com:80/app/html/index.html?a=1&b=2#title"
// let obj = url.parse(str)
// let query = obj.query//a=1&b=2
// let querryArr=query.split("&") //["a=1","b=2"]
// let json={}
// for(var i=0;i<querryArr.length;i++){
// let arr= querryArr[i].split("=")
// json[arr[0]]=arr[1]
// // console.log(arr)
// }
// console.log(json)
// console.log(query.split("&"))
let obj= url.parse(str,true)
// console.log(obj.query)
//转回字符串对象
console.log(url.format(obj))
querystring 模块
作用
处理查询字符串 如:?key=value&key2=value2
用法
querystring.parse(str) 返回对象
querystring.stringify(obj) 返回字符串
let querystring = require("querystring")
let str = "a=1&b=2&c=3"
// //转化为对象
// console.log(querystring.parse(str))//{ a: '1', b: '2', c: '3' }
//obj=> str
console.log(querystring.stringify({a:1,b:2}))
简单的接口处理
//处理接口
//1.引入相应的原生模块、依赖
let http = require("http")
let fs = require("fs")
let url = require("url")
let querystring = require("querystring")
//2.实例化http对象(服务器对象)
let app = http.createServer((req,res)=>{
//排除 /favicon.ico的请求
if(req.url.indexOf("/favicon.ico") === -1){
//需要判断要读取的是动态资源(接口api)还是静态资源
if(req.url.indexOf("/api") !== -1){ //处理接口
//处理地址栏的数据
let urlObj = url.parse(req.url,true)
console.log(urlObj.query)
//非地址栏的数据
let noAddressData = "" //存放非地址栏的数据
req.on("data",chunk=>{ //chunk代表抓取的一片数据,data事件内部会频繁的触发
noAddressData += chunk
})
req.on("end",()=>{ //数据已经全部接受完毕
console.log("非地址栏的数据:",querystring.parse(noAddressData))
})
}else{ //处理静态资源 /index.html
try {
let path = req.url === "/" ? "/index.html" : req.url;
let html = fs.readFileSync("./www"+path)
//直接将html结果返回给浏览器
res.write(html)
} catch (error) {
let html = fs.readFileSync("./www/nopage.html")
res.write(html)
}
}
}
res.end()
})
//监听服务器
app.listen(3000)