nodejs基础-1

nodejs

请参考nodejs中文 文档

作用

使用js 来写后台程序

目标

数据服务,文件服务,web服务

优势

性能高,方便、入门难度低、大公司都在用(BAT)

劣势

  • 服务器提供的相对较少
  • 相对其他语言,能用的上的学习资料少
  • 对程序员的要求相对较高

注意

nodejs 使用的是ECMA语法,不可使用DOMBOM

推荐命令行工具:supervisor nodemon

安装方式: npm install supervisor -gnpm 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)
发布了9 篇原创文章 · 获赞 0 · 访问量 97

猜你喜欢

转载自blog.csdn.net/weixin_43861707/article/details/104761764