node复习
node概述
node就是js的运行环境,在node环境中没有浏览器的一些内容。但是内置额外的增加了一些模块,
node应用场景
1、作为后端的API服务来提供数据支持
2、作为前端的开发环境
npm
初始化项目
npm也叫做包管理器,可以管理好项目中所依赖的一些第三方的软件包。这些依赖信息全部记录在package.json
的文件中
npm init -y
npm包管理
本地与全局安装
1、全局安装
npm install -g 包名称
全局安装一般是为了得到一个全局的操作命令
2、本地安装
npm install 包名称
在当前项目的目录下会使用node_modules目录保存相关的源码文件
开发与生产依赖
是根据包对项目的作用进行区分,有的包只是为了辅助写代码就叫开发依赖,部分是项目必不可少,叫做生产依赖
1、开发依赖
npm install --save-dev 包名称
2、生产依赖
npm install --save 包名称
自动重启应用
当使用node解析文件时,node会将文件的代码载入到内存中,如果文件修改了,如果不重启导致修改无效
npm install -g nodemon
模块
node中每一个文件就是一个模块。每个模块中都内置有module对象(类似浏览器端的window对象)。可以通过module.exports或者exports进行导出
1、导出
const fn = number => console.log(number)
module.exports ={
fn
}
2、导入
const {fn} = require('./1、导出')
console.log(fn)
内置模块
文档地址: https://www.nodeapp.cn/fs.html#fs_event_open
OS模块
const os = require('os')
// 换行的分割符号
console.log('a'+os.EOL+'b');
// 查看内存 单位是字节
console.log(os.freemem())
console.log(os.freemem()/1024/1024)
path模块
在使用浏览器访问Apache下的文件时,所使用的url地址绝对会跟指定目录下的文件对应起来,path模块就是用于
处理文件目录信息
const path = require('path')
const filename = 'a/b/c/1.jpg'
// 提取地址中文件名称
console.log(path.basename(filename))
// 提取目录信息
console.log(path.dirname(filename));
// 获取文件的后缀名称
console.log(path.extname(filename))
// 分析文件的地址信息返回为对象 对立的方法叫做format 用于将对象格式的地址组装起来
console.log(path.parse(filename))
// 获取文件目录分割符号 window是\ Linux是/
console.log(path.sep)
// 组装地址 自动根据操作系统的分割符号进行拼接 并且参数任意个数 也可以使用../表示上一级
console.log(path.join('a','b','c','d','1.txt'))
// __filename __dirname 在那个文件下运行就显示对应文件的 地址信息
// 获取当前的文件的绝对地址
console.log(__filename)
// 获取当前文件的目录信息
console.log(__dirname)
const {fn} = require('./1、导出')
fn()
url模块
const url = require('url')
let requestUrl = 'http://baidu.com/a/b/c/index.html?wd=余金跟江佳佳...&desc=击剑'
// parse只是不推荐而已
// 第一个参数指定要分析的地址 第二个参数指定是否要将URL中额外的参数转换为对象
console.log(url.parse(requestUrl,true))
/**
* Url {
protocol: 'http:',
slashes: true,
auth: null,
host: 'baidu.com',
port: null,
hostname: 'baidu.com',
hash: null,
search: '?wd=余金跟江佳佳...&desc=击剑',
query: [Object: null prototype] { wd: '余金跟江佳佳...', desc: '击剑' },
pathname: '/a/b/c/index.html',
path: '/a/b/c/index.html?wd=余金跟江佳佳...&desc=击剑',
href: 'http://baidu.com/a/b/c/index.html?wd=余金跟江佳佳...&desc=击剑'
}
*/
console.log(url.parse(requestUrl,true).query.desc)
fs模块
读文件
const fs = require('fs')
/**
* 异步读取文件内容
* fs.readFile(path[, options], callback)
*/
fs.readFile('1、导出.js',(error,content)=>{
if(error){
console.log('读取文件错误')
return
}
console.log(content.toString())
})
/**
* 同步读取文件
*/
try {
let content = fs.readFileSync('2、导入1.js')
console.log(content.toString())
} catch (error) {
console.log('文件地址错误')
}
写文件
const fs = require('fs')
/**
* 异步写入
* fs.writeFile(file, data[, options], callback)
*/
fs.writeFile('1.txt','李祥神',err=>{
err && console.log('写入错误 检查权限与文件地址')
})
查看文件的信息
1、查看文件信息
const fs = require('fs')
// statSync 是查看文件的方法 返回的是一个Stats对象
let fileStatus = fs.statSync('1.txt')
console.log(fileStatus)
2、结果
3、判断是否是文件
const fs = require('fs')
// statSync 是查看文件的方法 返回的是一个Stats对象
let fileStatus = fs.statSync('1.txt')
console.log(fileStatus)
console.log('1.txt是不是文件:',fileStatus.isFile())
console.log('1.txt是不是目录:',fileStatus.isDirectory())
读取目录下的信息
// 读取目录信息 就是将目录下的信息进扫描 所有的文件信息全部放到数组中
let files = fs.readdirSync('project')
console.log(files)
判断文件是否存在
// 判断文件是否存在
console.log(fs.existsSync('a/b/1.txt'))
http模块
// 导入内置模块
const http = require('http')
const server = http.createServer();
// 创建服务
http.createServer((request, response) => {
// 匿名函数就是请求到达之后的处理程序 request是node自动给我们的请求对象 response也是自动给过来的响应对象,如果需要从请求中获取内容就使用 request对象,如果需要进行响应控制 就设置response对象
// 获取请求地址
console.log(request.url)
// 获取请求头
console.log(request.headers)
// 获取请求方式
console.log(request.method)
// 设置响应头中content-type
response.setHeader('Content-Type','text/html;charset=utf-8')
// 向响应体中写入内容
response.write('还有4天放假')
// 如果响应体中内容已经设置完毕 一定要调用end方法标注一下,一旦调用了end 系统就会自动的组装http协议的响应格式进行发送
response.end('')
}).listen(8080, err => err && console.log('端口号被占用了'))
模拟Apache文件列表
const http = require('http')
// 载入地址模块
const path = require('path')
// 载入文件模块
const fs = require('fs')
// 需要列出来的目录
const rootPath = path.join(__dirname,'project')
// 创建服务
http.createServer((request, response) => {
let files = fs.readdirSync(rootPath)
// 读取模板中的内容 得到的结果为字符串
let content = fs.readFileSync('tpl.html').toString()
let newContent = ''
files.forEach(item=>newContent+=`<li><a href="">${item}</a></li>`)
// 先将要显示的标签组装完成 最后在将模板字符串进行替换
content = content.replace('{{content}}',newContent)
response.end(content)
}).listen(8080, err => err && console.log('端口号占用'))
搭建web服务
实现使用node代码完成提供web服务 不论请求是静态资源还是接口都能够正常使用
// 载入http模块
const http = require('http')
// 载入文件模块
const fs = require('fs')
// 载入url模块
const url = require('url')
// 载入path模块
const path = require('path')
// 定义项目的根目录
const rootPath = path.join(__dirname,'jd_shop')
// 创建服务
http.createServer((request, response) => {
// 从url地址上提取有用的数据 query请求携带的参数 pathname请求的路径
let {query,pathname} = url.parse(request.url,true)
// 组装用户访问的地址
let filename = path.join(rootPath,pathname)
// 验证用户请求的文件是否存在
if(fs.existsSync(filename)){
// 读取文件内容 将文件的内容发送出去
let content = fs.readFileSync(filename)
response.end(content)
}else{
// 文件不存在
// 设置响应状态码
response.statusCode = 404
response.end('not found')
}
}).listen(8080, err => err && console.log('端口号占用'))