一、当exports对象和module.exports对象指向的不是同一个对象时,以module.exports对象为准。
二、系统模块
// 1. fs.readFile() 读取文件
// 语法格式
fs.readFile('包含文件名的文件路径', ['文件编码'], callback)
// 例子
fs.readFile('./01.helloword.js', 'UTF-8', (err, doc) => {
// 如果文件读取错误err,是一个对象,包含错误信息
// 如果文件读取正确,err是空
// doc是文件读取的结果
console.log(err)
console.log(doc)
})
// 2. fs.writeFile() 写入文件内容
// 语法格式
fs.writeFile('包含文件名的文件路径', '要写入的内容', callback)
// 例子
fs.writeFile('./demo.txt', '即将要写入的内容', (error) => {
// 写入失败
if (error !== null) return console.log(error)
// 写入成功
console.log('写入成功')
});
三、path路径拼接语法
// 语法:
path.join('路径','路径',...)
// 例子
// public/upload/avator
const path = require('path')
// 路径拼接
const finalPath = path.join('public', 'upload', 'avator');
四、相对路径和绝对路径
- 大多数情况下使用绝对路径,因为相对路径有时候相对的是命令行工具的当前工作目录
- 在读取文件或者设置文件路径时都会选择绝对路径
- 使用__dirname获取当前文件所在的绝对路径
path.join(__dirname, '05.readfile.js')
五、第三方模块
1. nodemon是一个命令行工具,用以辅助项目开发(在Node.js中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐)。
2. nrm:npm下载地址切换工具(npm默认的下载地址在国外,国内下载速度慢)
3. Gulp:基于node平台开发的前端构建工具。将机械化操作编写成任务,想要执行机械化操作时执行一个命令行命令任务就能自动执行了。(用机器代替手工,提高开发效率)
Gulp的功能:
1) 项目上线,HTML、CSS、JS文件压缩合并
2) 语法转换(es6,less)
3) 公共文件抽离
4) 修改文件浏览器自动刷新
Gulp的方法:
1) gulp.src() 获取任务要处理的文件
2) gulp.pipe()
2) gulp.dest() 输出文件
3) gulp.task() 简历gulp任务
4) gulp.watch() 监控文件的变化
六、package.json文件
项目描文件,记录当前项目信息,例如项目名称、版本、作者、github地址。
七、web服务器
1.创建服务器,get请求
// 用于创建网站服务器的模块
const http = require('http');
// 用于处理url地址
const url = require('url');
// app对象就是网站服务器对象
const app = http.createServer();
// 当客户端有请求的时候
app.on('request', (req,res) => {
// req.method 获取请求方式
// req.url 获取请求地址
// req.headers 获取请求报文信息
// 响应报文
res.writeHead(200, {
'content-type': 'text/html;charset=utf-8'
})
console.log(req.url)
// 1. 要解析的url地址
// 2. 将查询参数解析成对象形式
let { query, pathname } = url.parse(req.url, true);
console.log(query.name)
if (pathname == '/index' || pathname == '/') {
res.end('<h2>欢迎来到首页</h2>')
} else if (pathname == '/list') {
res.end('<h2>欢迎来到列表页</h2>')
} else {
res.end('not found')
}
// if (req.method == 'GET') {
// res.end('<h2>hello user 欢迎来到首页</h2>')
// // res.end('get')
// } else {
// res.end('post')
// }
});
// 监听端口
app.listen(3000)
console.log('网站服务器启动成功')
2. post请求参数
1)参数被放置在请求体中进行传输
2)获取POST参数需要使用data事件和end事件
3)使用querystring系统模块将参数转换为对象格式
// 用于创建网站服务器的模块
const http = require('http');
// 处理请求参数模块
const querystring = require('querystring');
// app对象就是网站服务器对象
const app = http.createServer();
// 当客户端有请求的时候
app.on('request', (req,res) => {
// post参数是通过事件的方式接收的
// data 当请求参数传递的时候触发data事件
// end 当参数传递完成的时候触发end事件
let postParms = '';
req.on('data', (params) => {
postParms += params;
});
req.on('end', () => {
console.log(querystring.parse(postParms));
});
res.end('ok')
});
// 监听端口
app.listen(3000)
console.log('网站服务器启动成功')
3.静态资源,动态资源
const http = require('http');
const app = http.createServer();
const url = require('url');
const path = require('path');
const fs = require('fs');
// 读取文件类型
const mime = require('mime');
app.on('request', (req, res) => {
// 获取用户请求的路径
let pathname = url.parse(req.url).pathname;
pathname = pathname == '/' ? 'index.html' : pathname;
let realPath = path.join(__dirname, 'public', pathname);
let type = mime.getType(realPath);
fs.readFile(realPath, (error, result) => {
if (error !== null) {
res.writeHead(404, {
'content-type': 'text/html;charset=utf8'
});
res.end('文件读取失败')
return
}
res.writeHead(200, {
'content-type': type
})
res.end(result);
});
});
app.listen(3000)
console.log('服务启动成功')
八、异步编程
1. Promise 解决异步编程得回调地狱
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
if (true) {
resolve({name: '张三'});
} else {
reject('失败了');
}
}, 2000)
});
promise.then(result => {
console.log(result)
})
promise.catch(error => {
console.log(error)
})
2. 异步函数
异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码携程同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了。
anync 关键字
1)普通函数定义前加async关键字,普通函数变成异步函数
2)异步函数默认返回promise对象
3)在异步函数内部使用return关键字进行结果返回,结果会被包裹在promise对象中,return关键字代替了resolve方法
4)在异步函数内部使用throw关键字抛出程序异常
5)调用异步函数再链式调用then方法获取异步函数执行结果
6)调用异步函数再链式调用catch方法获取异步函数执行的错误信息
await 关键字
1)await关键字只能出现在异步函数中
2) await promise, await后面只能写promise对象,写其他类型的API是不可以的
3)await关键字可以暂停异步函数向下执行,直到promise返回结果
// 1. 普通函数定义的前面加上async关键字,普通函数就变成了异步函数
// 2. 异步函数默认的返回值是promise对象
// 3. 在异步函数内部使用throw关键字进行错误的抛出
// await关键字
// 1. 它只能出现在异步函数中
// 2. await promise 它可以暂停异步函数的执行,等待promise对象返回结果后再向下执行。
async function fn () {
throw '出错了';
return 123;
}
fn().then((data) => {
console.log(data)
}).catch((error) => {
console.log(error)
})
async function p1 () {
return 'p1';
}
async function p2 () {
return 'p2';
}
async function p3 () {
return 'p3';
}
async function run () {
let r1 = await p1()
let r2 = await p2()
let r3 = await p3()
console.log(r1)
console.log(r2)
console.log(r3)
}
run()
九、Express编程
express框架提供了方便简洁的路由定义方式。
express框架对获取HTTP请求参数进行了简化处理。
express对模板引擎支持程度高,方便渲染动态HTML页面。
express提供了中间件机制有效控制HTTP请求。
express拥有大量第三方中间件对功能进行扩展
// 引用express框架
const express = require('express');
// 创建网站服务器
const app = express();
app.get('/', (req, res) => {
// send()
// 1. send方法内部会检测响应内容的类型
// 2. send方法会自动设置http状态码
// 3. send方法会帮助我们自动设置响应的内容类型及编码
res.send('hello,express');
})
app.get('/list', (req, res) => {
res.send({name: '张三', age: 23});
})
app.listen(3000);
console.log('服务启动成功')
1. 中间件
中间件应用
1)路由保护,客户端在访问需要登录的页面是,可以先使用中间件判断用户登录状态,用户如果未登录,则拦截请求,直接响应,禁止用户进入需要登陆的页面。
2)网站维护公告,在所有路由的最上面定义接收所有请求的中间件,直接为客户端做出响应,网站正在维护中。
3)自定义404页面。