0517nodejs

丘普松
2023-12-01

Nodejs

1、node的应用场景

创建应用服务
web开发
接口开发
客户端应用工具,react、vue、gulp、webpack脚手架

2、模块化

导出  module.exports
导入  require
// commonjs规范  == 只能在nodejs中使用,不可以浏览器中使用 cmd/amd/es6
// 导出 exports module.exports
// 区别:
// 共同点:导出模块
// 差别:module.exports它可以导出对象,而exports不可以
// exports = module.exports  引用 原型指向
// 导入
// require(路径)

2.1、核心模块

// 导入一个内置的模块,os模块,使用一个变量接受
/* const os = require('os')
console.log(os.hostname()); */

2.2、第三方模块

// 如果安装第3方法模块,第一步先查看一下当前项目中,有没有package.json文件,如果没有则初始化一下
// npm init -y
// npm i -S lodash
/* const _ = require('lodash')
// 分割数组
console.log(_.chunk(['a', 'b', 'c', 'd'], 2)); */

2.3、自定义模块

// commonjs中,把一个文件当作一个模块
/* const fn = require('./userModule')
console.log(fn());
 */

/* const fn = require('user')
console.log(fn());
 */

tips:
若调用模块返回的是一个实例化对象,但是想用类,可以使用以下方法

const user = require('user');   //一个实例化对象
console.log(user.getName());
console.log(user.__proto__.constructor);//找到类

3、命令参数和环境变量

node app.js --port 8080;//对于node来说app.js --port 8080都是参数
可以通过process这个内置对象完成参数的获取
以下方法对命令参数处理

/* let args = {}
let arr = process.argv.slice(2);
arr.forEach((item, index) => {
  // console.log(/^-/.test(item));
  if (item.startsWith('--')) {
    args[item.slice(2)] = arr[index + 1]
  }
})
console.log(args); */

/* let args = process.argv.slice(2).reduce((p, c, index, arr) => {
  if (c.startsWith('--')) {
    p[c.slice(2)] = arr[index + 1]
  }
  return p
}, {});
console.log(args);
 */
const argv = require('minimist');//npm i -S minimist  需要安装库文件

console.log(argv(process.argv.slice(2)));

4、cross-env修改环境


// 获取指定的环境变量
if (process.env.NODE_ENV == 'dev') {
  // 开发环境
  console.log('开发中');
} else if (process.env.NODE_ENV == 'test') {
  console.log('测试中');
} else if (process.env.NODE_ENV == 'production') {
  console.log('上线');
} else {
  // throw new Error('有误')
  console.log('我们的环境有 dev|test|production');
}

//===================================================
//package.json文件中修改
{
  "name": "01_base",
  "version": "1.0.0",
  "description": "",
  "main": "01_module.js",
  "scripts": {
    "dev": "cross-env NODE_ENV=dev node 03_env.js",
    "test": "cross-env NODE_ENV=test node 03_env.js",
    "build": "cross-env NODE_ENV=production node 03_env.js"
  },
  "keywords": [],
  "author": "wuchen",
  "license": "ISC",
  "dependencies": {
    "minimist": "^1.2.5"
  },
  "devDependencies": {
    "cross-env": "^7.0.3"
  }
}

//=============================
//用npm启动,例如
npm run dev

5、常用内置模块

5.1、os

const os = require('os')
// 换行符
os.EOL //根据操作系统生成对应的换行符 window \r\n,linux下面 \n

// 查看cpu相关信息
os.cpus()

// 总内存大小 (单位 字节)
os.totalmem()
// 空余内存大小 (单位 字节)
os.freemem()

5.2、path

const path = require('path')

// 获取路径最后一部内容  一般用它来获取文件名称
path.basename('c:/a/b/c/d.html')  // d.html

// 获取目录名,路径最后分隔符部分被忽略
path.dirname('c:/a/b/c/d.html') // c:/a/b/c

// 获取路径中文件扩展名
path.extname('c:/a/b/c/d.html') // .html

// 给定的路径连接在一起
path.join('/a', 'b', 'c') // /a/b/c
// 把相对地址转为绝对路径
path.resolve('/a', '../b')

5.3url

// const url = require('url')
// let href = 'https://new.qq.com/omn/20210516/20210516A09D5P00.html?id=100#hash'

// 参数1:分析url地址
// 参数2:boolean true为query属性转为对象,false字符串
// 参数3:一般不用 boolean true时,在url地址没有写协议时,还可以获取主机名
// console.log(url.parse(href, true, true));
// console.log(url.parse(href, true));
/* const { pathname, query } = url.parse(href, true)
console.log(pathname, query); */

//============================================
// URL js内置

// let href = 'https://new.qq.com/omn/20210516/20210516A09D5P00.html?id=100&name=lisi#hash'
// getAll()
// let href = 'https://new.qq.com/omn/20210516/20210516A09D5P00.html?id=100&id=200&name=lisi#hash'
// 全部的get数据
let href = 'https://new.qq.com/omn/20210516/20210516A09D5P00.html?id=100&name=lisi#hash'
const url = new URL(href);
// console.log(url.searchParams);
// console.log(url.searchParams.get('id'));
// console.log(url.searchParams.get('name'));

// 获取query中相同名称的数据 以数组形返回
// console.log(url.searchParams.getAll('id'));

// 获取全部的get数据
// console.log(url.searchParams.entries());
for (let [key, value] of url.searchParams.entries()) {
  console.log(key, value);
}

5.4、querystring

用于解析和格式化url的工具

const querystring = require('querystring')

// query字符串转为对象
querystring.parse('foo=bar&abc=xyz')

// 对象转为query字符串
querystring.stringify({ foo: 'bar',abc: 'xyz'})

5.5、fs模块

const fs = require('fs')

let filepath = path.resolve('data/lisi.txt');

//文件操作
// 写入数据
fs.writeFile(文件路径,数据,err=>{})

// 读取文件中数据
fs.readFile(filepath , 'utf8’,(err,data)=>{})

// 检查文件或目录是否存在    返回true/false
fs.existsSync(path)

// 获取文件信息
fs.stat(filepath ,(err,stats)=>{
	stats.isDirectory() // 是否是目录
	stats.isFile()       // 是否为文件
	stats.size            // 文件大小(以字节为单位)
})

// 删除文件
fs.unlink(filepath ,err=>{})

//=================================
// 目录操作
// 创建目录
fs.mkdir('./logs', { recursive: true }, (err) => {
  console.log('done.')
})
// 删除目录
fs.rmdir('./logs', { recursive: true }, () => {
  console.log('done.')
})
// 读取目录列表
fs.readdir(path, (err,data) => {
    // data是一个数组,里面包含了当前路径下所有的文件和文件夹名称
})
//=======================
//删除文件的异步写法
delDir(dirpath, () => { })

function delDir(dirpath, cb) {
  fs.stat(dirpath, (err, stat) => {
    if (stat.isFile()) {
      fs.unlink(dirpath, cb)
    } else {
      fs.readdir(dirpath, 'utf-8', (err, dirs) => {
        if (dirs.length == 0) {
          // 此目录是一个空目录
          fs.rmdir(dirpath, cb)
        } else {
          // 读取的目录中的相对路径转为绝对路径
          dirs = dirs.map(item => path.join(dirpath, item))

          let index = 0;
          function doneFn() {
            if (++index == dirs.length) {
              fs.rmdir(dirpath, cb)
            }
          }
          dirs.forEach(dir => {
            delDir(dir, doneFn)
          })
        }
      })
    }
  })
}

5.6、触发器

类似于js中的抛发侦听时间
先订阅后发布

const EventEmitter = require('events')
const events = new EventEmitter();

// 订阅
events.on('上课了', arg => {
  console.log('小明订阅:' + arg);
})

events.on('上课了', (arg) => {
  console.log('小张订阅:' + arg);
})
##############
events.emit('上课了', '今天讲nodejs')

6、web服务器

Web服务器一般指的是网站服务器,是指驻留因特网上某一台或N台计算机的程序,可以处理浏览器等Web客户端的请求并返回相应响应,目前最主流的三个Web服务器是Apache、 Nginx 、IIS、Tomcat。
服务器:IP地址、域名、端口、协议

6.1、创建web服务

// 成为一个http服务器
// 主机 + 协议(nodejs中的http模块[http协议]) + 端口号
// http事件处理
const http = require('http');
const {now} = require('./utils/date')
// 创建一个web服务器
const server = http.createServer()

// 监听事件 浏览端请求  request
// request 请求对象 用于获取浏览器请求 头和体
// response 服务器对浏览器的响应 行+头+体
server.on('request', (request, response) => {
  // 当前的请求 uri
  // console.log(request.url);
  // 获取请求方法
  // console.log(request.method);

  // 请求头获取
  // console.log(request.headers);
  if (request.url !== '/favicon.ico') {
    console.log(now());
    console.log(request.headers['user-agent']);
  }




  // 响应头
  // response.setHeader('Content-Type', 'text/plain;charset=utf-8')
  // response.setHeader('Content-Type', 'text/html;charset=utf-8')
  response.setHeader('Content-Type', 'application/json;charset=utf-8')
  // 服务器给浏览器响应
  // response.end('你好世界')
  // response.end('<h3>你好世界</h3>')
  response.end(JSON.stringify({ id: 1, name: '张三' }))

})

// 监听 端口
// 0.0.0.0 => 监听服务器中所有的网址请求
// 具体的ip 对应的此网卡的ip才能访问   10   200
// ifconfig => linux
server.listen(3000, '0.0.0.0', () => {
  console.log('服务已启动 http://127.0.0.1:3000');
})
 类似资料:

相关阅读

相关文章

相关问答