Node

作者: zhchhhemmm | 来源:发表于2019-12-31 16:26 被阅读0次

1.所有的ES语法在Node中都可以用

JS开发弊端:

1 文件依赖不明确
2 命名冲突

模块化开发

用exports导出模块内部的成员,可以是变量,可以是方法等
eg
exports.sayHi = sayHi;
用module.exports导出:
module.exports.sayHi = sayHi
当exports对象和module.exports对象指向了不同的对象时, 最终以module.exports为准。

用require导入模块
require(' 文件路径 '),返回值是到处的元素,路径的后缀是可以省略的

系统模块

即:node运行环境提供的API
eg:
fs模块:文件操作模块

const fs = require('fs')

fs.readFile('文件路径'[,''文件编码],callback);

eg:
fs.readFile('../css/index.css','utf-8',(err,doc)=>{
    if(err){
    }
    ....
})
PATH模块

主要的功能有:路径拼接(不同的操作系统,文件路径是不同的,如win:'/',''都可以,linux只能'/')
path.join('路径1','路径2',.....);
用__dirname可以得到当前绝对路径(命令行的工作目录)
eg:


image.png
url模块

用于处理url地址。用法:

const url = require("url")
let params =  url.parse(req,url,ture)
params.query就是解析好的参数对象
params.pathname就是不包含请求参数的请求地址
第三方模块

通常又称为 包

  1. 以JS文件存在
    提供实现项目具体开发的API接口。
  2. 以命令行工具形式存在
    辅助项目开发
nodemom

一个第三方的命令行工具
监控文件的保存操作,修改完后自动重新执行
全局安装nodemon,并且用nodemon去执行js文件,而不是用node

mime模块

mime.getType(path)
根据路径,返回资源类型

router模块

用途:实现路由
使用步骤
1 获取路由对象
2 调用路由对象提供的方法创建路由
3 启用路由,是路由生效


image.png
const getRouter = require('router')
const router = getRouter()
router.get('/add',(req,res)=>{
  res.end('hello world!')
})
server.on('request',(req,res)=>{
  router(req,res,()=>{})
})
serve-static模块

功能:实现静态资源访问


image.png

基本步骤

  1. 引入系统模块http
  2. 创建网站服务器
  3. 为网站服务器对象添加请求事件
  4. 实现路由功能
    4.1 获取客户端的请求方式
    4.2 获取客户端的请求地址
获取请求方式:
const method = req.method.toLowerCase()
获取请求地址:
const pathname = url.parse(req.url).pathname
防止页面中文乱码:
res.writeHead(200,{
    'content-type':'text/html;charset=utf8' 
})
静态资源

静态资源指的是:
服务器端不需要做任何处理,可以直接响应给客户端的资源就是静态资源,例如CSS,JS,Image等

动态资源

相同的请求地址,不同的相应资源,这种资源就是动态资源
eg:


image.png
同步与异步

同步API:只有在当前API执行完成后,才可以去执行下一个API
eg:
console.log('a')
console.log('b')
必然时先输出a再输出b
异步API:
eg:
setTimeout

区别:
同步API可以从返回值中拿到API执行的结果,但是异步API的不可以的

可以通过匿名函数传参数的方式拿到异步API的执行结果(回调函数)
eg:

function getMsg(callback){
  setTimeout(function(){
    callback({msg:'111'})
  },2000)
}
getMsg(function(data){
  console.log(data)
})

在异步API中,如果我们想按一定的顺序执行一些异步API、
方法一:
在回调函数中进行嵌套。eg:

const fs = require('fs')
fs.readFile('./1.txt','utf8',(r1)=>{
   console.log(r1);
   fs.readFile('./2.txt','utf8',(r2)=>{
      console.log(r2);
      fs.readFile('./3.txt','utf8',(r3)=>{
        console.log(r3)
      })
   })
})

但是这样写回带来一个问题:过多的嵌套会导致代码不可维护,称为:嵌套地狱。解决方法:

Promise对象

解决嵌套地狱的办法:

const fs = require('fs');
function p1(){
    return  new Promise((resolve,reject)=>{
        fs.readFile('./1.txt','utf8',(err,result)=>{
            if(err) reject(err)
            else resolve(result)
        })
    })
    // return p1;
}
function p2(){
    return  new Promise((resolve,reject)=>{
        fs.readFile('./2.txt','utf8',(err,result)=>{
            if(err) reject(err)
            else resolve(result)
        })
    })
    // return p2;
}
function p3(){
    return  new Promise((resolve,reject)=>{
        fs.readFile('./3.txt','utf8',(err,result)=>{
            if(err) reject(err)
            else resolve(result)
        })
    })
    // return p3
}

p1().then((r1)=>{
    console.log(r1)
    return p2()
    //只需要把p2()return,下一个then拿到的就是p2对象
}).then((r2)=>{
    console.log(r2)
    return p3()
}).then((r3)=>{
    console.log(r3)
})

但是,promise方法,代码量大,臃肿。

异步函数
const fn = async ()=>{};
async function fn(){}

这样的函数被称为异步函数,这是ES7的语法

写法:

//定义一个异步函数

//异步函数的默认返回值时promise对象

//await关键字  只能出现在异步函数中。
//await 后面跟promise对象 它可以暂停异步函数的执行 等待promise对象返回结构后再向下执行函数
async function fn(){

}
console.log(fn())  //Promise { undefined }

async function fnn(){
    throw '发生了一些错误'
    return 123;
}
console.log(fnn()) //Promise { 123 }

fnn().then((data)=>{
    console.log(data);  // 123
}).catch(function(err){
    console.log(err);  //发生了一些错误。且:写了throw后,原本的return就不再执行了
    
})
//读取文件的例子

const fs = require('fs')
const promisify = require('util').promisify

//因为fs.readFile返回的不知promise对象,用promisify来改造它
const readFile = promisify(fs.readFile)

async function run(){
    let r1 = await readFile('1.txt','utf8')
    let r2 = await readFile('2.txt','utf8')
    let r3 = await readFile('3.txt','utf8')
    console.log(r1);
    console.log(r2);
    console.log(r3);
    
}
run()

现在就变得非常地简洁了

Node中的global对象

浏览器中的全局对象是window,node中的全局对象global,在使用中,global可以省略

相关文章

网友评论

      本文标题:Node

      本文链接:https://www.haomeiwen.com/subject/mswboctx.html