node 入门知识点 码字ing

146 阅读5分钟

Node.js介绍

  • Node.js是一个JavaScript运行环境。它让JavaScript可以开发后端程序。它几乎能实现其他后端语言能实现的所有功能。
  • Node.js是基于Google V8引擎,V8 引擎室Google发布的一款开源的JavaScript引擎,原来主要用于Chorme浏览器的js解释部分,但是作者鬼才般的将这个V8引擎搬到了服务器,用于做服务器的软件。

Node.js最擅长高并发

  • Node.js最擅长处理高并发,在Java、PHP或者.net等服务器语言中,会为每一个客户端创建一个新的线程,而每个线程需要耗费大约2MB内存,也就是说,理论上一个8GB内存的服务器可以同时连接的最大用户数为4000个左右。想要让WEB应用程序支持更多的用户,就需要增加服务器的数量,而Web应用程序的硬件自然就上升了。Node.js不为每一个客户连接创建一个新的线程,而仅仅使用一个线程,当有用户连接了,就触发一个内部事件,通过非阻塞I/O、时间驱动机制,让Node.js程序宏观上也是并行的。使用node.js,一个8GB内存的服务器,可以同时处理超过4万用户的连接。

Node.js可实现的功能多

  • Node.js不仅可以像其他后端语言一样写动态网站、写接口、还可以应用在云计算平台、游戏开发、区块链开发、即时通讯、跨平台App开发、云直播等。

Node.js创建第一个应用

  • 如果我们使用PHP来编写后端代码时,需要Apache或者Nginx的HTTP服务器,来处理客户端的请求响应,不过对node.js来说,概念完全不一样了,使用node.js时,我们不仅仅在实现一个应用,同时还能实现了整体HTTP服务器。

nodeJs中的模块

http模块

  • 引入http模块var http = require('http')

创建服务器

  • 输入node-http-server创建一个服务器
    http.createServer(function(request,response){
        response.writeHead(200,{'Content-Type':'text/html'})
        response.write('<head> <meta charset="UTF-8"> </head>')
        response.write('你好,世界')
        response.end('hello world')
    }).listen(8081)
    
    • request 接收浏览器获取url的信息
    • request.method 获取请求类型
    • response 给浏览器相应信息
    • response.writeHead 设置响应头,状态码是200,编码是text/html(这个输入页面配合mate可以解决乱码)
    • response.write('<head> <meta charset="UTF-8"> </head>')解决乱码
    • response.end 表示给我们页面上面输出一句话,并且结束响应
    • listen(8081) 表示服务器的端口号
  • 运行服务器,node 文件名.js

url模块

获取url信息

  • url.parse()解析url.parse(url,true) 现已被弃用使用以下两种方法替换,如果没有传第二个参数true,则会返回未解析乱码的字符串,如果写true返回的是解析的对象。
    • 引入querystring
      const querystring = require('querystring')
      let url = 'http://127.0.0.1:8081/?name=张三&age=23'
      let params = querystring.parse(url.split("?")[1])
      console.log(params) //{ name: '张三', age: '23' }
      
    • 创建一个URL实例,使用searchParams.get获取
      let url = 'http://127.0.0.1:8081/?name=张三&age=23'
      let data = new URL(url)
      let params = data.searchParams.get(url.split('?')[1])
      console.log(params) //张三
      

common.js模块 文件导出引入

  • 导出
    • exports.api = obj
    • moudle.exports = obj
    • exports.fn = function(){}
  • 打开package.json文件,在script的对象下面添加"start":"nodemon app.js"
  • 启动项目 npm start

fs模块

fs.stat 检测是文件还是目录

fs.stat('./package.json', (err, data) => {
   if (err) {
       console.log(err, data, 567);
       return
   }
   console.log(data.isFile()); ///true 是文件吗
   console.log(data.isDirectory()); ///false 是文件夹吗
   
   
});

fs.mkdir 创建目录

fs.mkdir('./css', (err, data) => {
   console.log('创建成功');
})

fs.writeFile 创建写入文件

fs.writeFile('./css/index.css', 'body {color:red}',(err, data) => {
   console.log('创建成功');
})

fs.appendFile 追加文件

fs.appendFile('./assets/css.css','body {color : red}' , (err, data) => {
  console.log(data.toString());
  return
})

fs.readFile 读取文件

fs.readFile('./package.json', (err, data) => {
   console.log(data.toString());
   return
})

fs.readdir 读取目录

fs.readdir('./css', (err, data) => {
   console.log(data);
   return
})

fs.rename 重命名

fs.rename('./css', './asset', (err, data) => {
   console.log(data);
   return
})

fs.rmdir 删除目录

fs.unlink 删除文件

fs.unlink('./asset/css.css', (err, data) => {
   console.log(data);
   return
})

从文件流中读取数据

const fs = require('fs')
let readStream = fs.createReadStream('./index.html')
let str = ''
let count = 0
//开始读取文件流的数据,它是分批次读取的然后拼接到str上
readStream.on('data', data => {
    str += data
    count++

})
//文件流读取结束
readStream.on('end', () => {
    console.log(count, str, '239');
})
//文件流读取数据失败
readStream.on('error',(err)=>{
})

createWriteStream以流的方式写入文件

let writeStream = fs.createWriteStream('index.text')
writeStream.write('你好,的十分士大夫撒会发生开发杀害算法撒旦和骷髅法师','utf-8')
writeStream.end()
writeStream.on('finish', () => {
    console.log('写入完成');
})
writeStream.on('error', () => {

    console.log('写入错误');
})

管道流

  • 一般用于大文件的复制
 //创建一个可读流
 let readerStream = fs.createReadStream('moto.jpg')
 //创建一个可写流
 let writeStream = fs.createWriteStream('./asset/moto.jpg')
 //管道读写操作
 readerStream.pipe(writeStream)
 console.log('管道读写完成')

path 模块

获取后缀名

  • path.extname()

npm 安装的版本号

  • ^ 表示第一位版本号不变,后面两位数取最新
  • ~ 表示前两位不变,最后一个取最新
  • * 表示全部取最新

Node.js热更新方案

supervisor插件

  • 插件安装和使用方法
    // 全局安装supervisor
    npm i -g supervisor
    
  • 启动node项目命令supervisor app.js

nodemon插件

  • 插件的安装和使用
    // 初始化项目,也是安装package.json
    npm init 
    // 安装nodemon
    npm i -g nodemon
    

创建文件夹的插件mkdirp

  • 比原生mkdir功能更强大
  • 下载npm i mkdirp
  • 使用的两种方法
    const mkdirp = require('mkdirp')
    
    const made = mkdirp.sync('/tmp/foo/bar/baz')
    console.log(`made directories, starting with ${made}`)
    //或者是
    mkdirp('/tmp/foo/bar/baz').then(made =>
    console.log(`made directories, starting with ${made}`))
    

利用node.js创建一个静态的web服务器

  • 读取文件,利用res.end()返回页面
const fs = require('fs');
var http = require('http');
const path = require('path')
const common = require('./common')
http.createServer(function (req, res) {
 console.log(req.url, 'req3456');
 let pathName = req.url
 pathName = pathName == '/' ? '/index.html' : pathName
 console.log(pathName, 'reds');
 if (pathName != '/favicon.ico') {
   fs.readFile('.' + pathName, (err, data) => {
     if (err) {
       res.writeHead(404, { 'Content-Type': 'text/html;charset="utf-8"' })
       res.end('页面不存在');
       return
     }
     let extName = path.extname(pathName)
     let type = common.getMime(extName)
     res.writeHead(200, { 'Content-Type': '' + type + ';charset="utf-8"' })
     res.end(data);
   })
 }

}).listen(3000);
console.log('Server running at http://127.0.0.1:3000/');

routes路由

  • 路由是由一个URL和一个特定的HTTP方法(get、post等)组成的,涉及到应用如何响应客户端对某个网站节点的访问。通俗的讲:路由指的是针对不同请求的URL,处理不同的业务逻辑

初识EJS模块引擎

  • EJS是后台模板,可以把我们数据库和文件读取的数据显示到HTML页面上面,它是一个第三方模块,需要通过npm安装引入。
  • 安装ejs模块
    • npm i ejs --save
  • 使用ejs
//js部分
let msg = '数据库里面获取的数据'
    let list = [{ title: 1 }, { title: 2 }, { title: 3 }, { title: 4 }, { title: 5 }, { title: 6 }]
    ejs.renderFile('./views/login.ejs', { msg: msg, list: list }, (err, data) => {
      res.writeHead(200, { 'Content-Type': 'text/html;charset="utf-8"' })
      res.end(data)
//html部分
 <h3>
        <%=msg%>
    </h3>
    <ul>
        <%for(var i=0;i<list.length;i++){%>
            <li>
                <%=list[i].title%>
            </li>
            <%}%>
    </ul>

get post

  • get从指定的资源请求数据,一般用于获取数据
  • post向指定的资源提交要被处理的数据,一般用于提交数据

获取get传值

let params = url.parse(res.url,true);
params.query

获取post传值