文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、nodejs是什么?
node.js是基于Chrome v8引擎的javascript runtime
- commonjs规范
node应用于各种包各种模块组成,采用的commonjs模块规范
commonjs加载模块是同步的,模块加载的顺序,按照其在代码中出现的顺序
require引入模块 module.exports 属性表示当前模块对外输出的接口
- 特点
单线程
非阻塞I/O(input/output)
事件驱动
- 模块化
内置模块、第三方模块、自定义模块
二、使用
1.安装
三、运行程序
js运行环境
-
浏览器(基本语法、dom、bom、ajax请求…)
-
服务器(基本语法、操作本地文件、操作数据库…)
-
限制语言能力的不是语言本身,而是语言的运行环境
运行nodejs程序
- 在命令行中执行node指令并回车,进行node的交互式环境(REPL环境)
- 把javascript代码写在后缀为.js的文件中,命令行执行:node xx.js
- 按下 ctrl + c 退出当前执行程序
- node.js是服务端的程序,写的js语句,都将运行在服务器上
- node.js没有根目录、没有web容器的概念!
nodemon
- nodemon会实时监听js代码,发现有修改后自动重启服务器
- 安装:npm install --global nodemon
- 之前使用:node xxx.js 改成:nodemon xxx.js
http模块
- http 模块 可以用于创建http服务器与http客户端
- 创建http服务器
- var http = require(‘http’); 加载http模块
- var server = http.createServer(); 创建http服务
- server.on(‘request’, callback); request事件用于监听来自客户端的请求
- server.listen(port, host, callback); 启动http服务,监听3000端口
const http = require('http')
let server = http.createServer()
server.on('request' , (req, res) =>{
// request 请求对象
// response 响应对象
console.log('有用户请求进来了')
res.setHeader('Content-Type','text/plain;charset=utf-8')
res.end('你好前端')
}
server.listen(3000, localhost, ()=>{
console.log('======= server start ========')
}
- 注意:
- 在监听request事件中,最后一定要res.end()结束响应。
- 浏览器显示中文可能是乱码,需设置响应头告诉浏览器显示时所使用的编码,要在res.end()之前设置响应头、状态码、响应内容类型及编码
res.setHeader(“Content-Type”,“text/plain;charset=utf-8”);
res.setHeader(“Content-Type”,“text/html;charset=utf-8”);
res.writeHead(200,{‘Content-Type’:‘text/html;charset=utf-8’});
Content-Type:用于定义用户的浏览器如何处理将要加载的数据
text/html 表示响应内容为html的形式,浏览器对响应内容按html解析
text/css 表示响应内容为css的形式,浏览器对响应内容按css解析
text/plain 表示响应内容为纯文本的形式,浏览器不会对其进行其它处理
application/json 表示响应内容为序列化后的 JSON 字符串
- 创建http客户端
- http.get()
- http.request()
const cheerio = require('cheerio')
const http = require('http')
const https = require('https')
// 创建http客户端
https.get(url, (res) => {
let str = ''
res.on('data', (chunk) => {
// chunk 接收到的是数据片段
str += chunk.toString('utf8')
})
res.on('end', ()=>{
console.log('数据传输完毕')
})
})
fs 模块
fs模块提供了用于与文件系统进行交互的API
- fs.readFile(file[, options], callback) 读文件
参数1:要读取的文件路径,必填。
参数2:读取文件时的选项,比如:文件编码utf8。选填。
参数3:文件读取完毕后的回调函数,必填。
// 异步读取文件
fs.readFile('./test.txt','utf8',(err,data)=>{
// 错误的回调优先,err默认值为null,如果有错err是一个错误对象
if(err){
console.log(err)
} else {
console.log(data) // 默认Buffer二进制数据流
}
})
// 同步读取文件,在关键位置捕获错误 try {} catch(){}
try {
var data = fs.readFileSync('./text.txt, 'utf-8')
} catch (err) {
console.log( err )
}
- fs.writeFile(file, data[, options], callback) 写文件
参数1:要写入的文件路径,必填。
参数2:要写入的数据,必填。
参数3:写入文件时的选项,比如:文件编码。选填。
参数4:文件写入完毕后的回调函数,必填。
// 异步写文件(覆盖写入),如果当前文件不存在则创建此文件
fs.writeFile('./text.txt', data , (err) => {
if (err) {
console.log('写入失败')
} else {
console.log('写入成功'
}
})
- fs.appendFile(file, data[, options], callback) 写文件
// 异步写文件(追加写入),如果当前文件不存在则创建此文件`
fs.appendFile('./text.txt', data , (err) => {
if (err) {
console.log('写入失败')
} else {
console.log('写入成功')
}
})
- fs.unlink() 删除文件
- fs.mkdir() 创建文件夹
// 删除文件
fs.unlink('./demo.html',(err)=>{
if (err) {
console.log('删除失败');
} else {
console.log('删除成功');
}
})
// 创建文件夹
fs.mkdir('./hehe',(err)=>{
if (err) {
console.log('创建失败');
} else {
console.log('创建成功');
}
})
- fs.readdir() 读取文件夹
fs.readdir('./hehe',(err, data)=>{
if (err) {
console.log('读取失败');
} else {
console.log(data) // [ 数组集合 ]
}
})
- fs.rmdir() 删除文件夹(只能删除空文件夹)
fs.rmdir('./hehe',(err)=>{
if (err) {
console.log('删除失败');
} else {
console.log('删除成功');
}
})
- fs.rename() 文件重命名
- fs.stat() 获得文件信息
stats.isFile()
stats.isDirectory()
// 判断是文件还是文件夹
fs.stat('./test.txt',(err,stats)=>{
if (err) {
console.log('获取文件信息失败');
} else {
console.log( stats.isFile() )// true 代表这个是文件
console.log( stats.isDirectory() )// true 代表这个是文件夹
}
})
url 模块
url 模块 用于处理与解析 URL
url 叫统一资源定位符
- url.parse()方法 将url字符串转成对象
- url.format()方法 将url对象转成字符串
let urlStr = 'https://www.baidu.com/ss/abc?wd=directory&spt=123&issp=888#head'
// 将url字符串转成对象
// let urlObj = url.parse(urlStr,false) // 第二个参数默认为false,query部分为字符串
let urlObj = url.parse(urlStr,true) // 第二个参数默认为true,query部分为对象
console.log( urlObj );
let url_o = {
protocol: 'https:',
slashes: true,
auth: null,
host: 'www.baidu.com',
port: null,
hostname: 'www.baidu.com',
hash: '#head',
search: '?wd=directory&spt=123&issp=888',
// query: 'wd=directory&spt=123&issp=888',
query: { wd: 'directory', spt: '123', issp: '888' },
pathname: '/ss/abc',
path: '/ss/abc?wd=directory&spt=123&issp=888',
href: 'https://www.baidu.com/ss/abc?wd=directory&spt=123&issp=888#head'
}
// 将url对象转成字符串
let url_s = url.format(url_o)
console.log(url_s);// https://www.baidu.com/ss/abc?wd=directory&spt=123&issp=888#head
querystring 模块
querystring模块提供用于解析和格式化URL查询字符串的实用工具
- qs.parse() 将query字符串转成对象
- qs.stringify 将对象转成query字符串
- qs.escape query字符串编码
- qs.unescape query字符串解码
// 将对象转成query字符串
// 第一个参数是要转换的对象
// 第二个参数是键值对之间的分隔符
// 第三个参数是键和值之间的分隔符
let obj = { wd: 'directory', spt: '123', issp: '888' }
console.log( qs.stringify(obj1) );// 'wd=directory&spt=123&issp=888'
// 等价于
console.log( qs.stringify(obj1,'&','=') ) // 'wd=directory&spt=123&issp=888'
// query字符串转成对象
let str = 'wd=directory&spt=123&issp=888'
console.log( qs.parse(str) );// { wd: 'directory', spt: '123', issp: '888' }
// 等价于
console.log( qs.parse(str,'&','=') );// { wd: 'directory', spt: '123', issp: '888' }
path 模块
path模块提供用于处理文件路径和目录路径的实用工具
path模块的默认操作会根据Node.js程序运行的操作系统而有所不同
- path.join(path1[, path2]…) 将多个路径规范化拼接,返回拼接后的路径
- path.resolve([…paths]) 将一系列路径解析成绝对路径,从右到左解析
如果没有参数调用,返回当前工作路径 - path.basename(path[, ext]) 返回路径的最后部分(文件名)
path目标路径,ext要截掉的内容 - path.dirname(path) 与basename相对,返回除最后一部分的前面部分路径
const path = require('path')
// 从右到左拼接
// join拼接返回相对路径
console.log( path.join('/user','login','index.html') );// '\user\login\index.html'
console.log( path.join('user','/login','./index.html') );// 'user\login\index.html'
console.log( path.join('user','../login','./index.html') );// 'login\index.html'
// resolve拼接返回绝对路径
console.log( path.resolve('/user','login','index.html') );
// D:\user\login\index.html
console.log( path.resolve('user','/login','./index.html') );
// D:\login\index.html
console.log( path.resolve('user','../login','./index.html') );
// D:\phpstudy_pro\WWW\test\2005\node\day01\login\index.html
let path1 = 'node/day01/login/index.html'
// 返回路径的最后一部分(文件名)
console.log( path.basename(path1) );// 'index.html'
console.log( path.basename(path1,'.html') );// 'index'
// 返回除了path.basename之外的内容
console.log( path.dirname(path1) );// 'node/day01/login'
四、第三方模块
nodemailer 发送邮件模块
第三方模块nodemailer用于发送邮件
安装:npm install nodemailer
查看官方文档:https://nodemailer.com/about/
// 安装nodemailer模块, 查找\node_modules\nodemailer\lib\well-known -> service.json
const nodemailer = require("nodemailer")
let transporter = nodemailer.createTransport({
host: "smtp.qq.com",// 发送者的邮箱主机名(service.json)
port: 465,// 端口号
secure: true, // 端口为465时为true,其他端口为false
auth: {
user: 'xxxxxx@qq.com', // 发送者的邮箱地址,如:12345678@qq.com
pass: 'bymhx123123123', // 发送者邮箱的smtp授权码
}
})
// 邮件信息对象
let mailInfo = {
from: '"x站管理员" <xxxxxx@qq.com>', // 发送者(昵称,邮箱地址)
to: "aaaaaaa@qq.com", // 接收邮件者邮箱地址列表
subject: "注册验证码", // 邮件主题
text: "您的验证码是12365有效为5分钟", // 文本格式的内容
// html: "<b>Hello world?</b>", // html格式的内容
}
// 文本格式的内容和html格式的内容 只能二选一
// 发送邮件
transporter.sendMail(mailInfo)
cheerio 模块
cheerio是实现类似jquery核心功能的一个模块
cheerio可以将字符串解析成DOM文档,像用jquery操作html一样方便
安装:npm install cheerio
const cheerio = require('cheerio')
// cheerio可以将字符串解析成DOM文档,像用jquery操作html一样方便
let $ = cheerio.load('<div><img src="./a1.jpg"/><img src="./a2.jpg"/></div>')
// 获取多个元素,遍历取值
$('img').each((i, item)=>{
let src = $(item).attr('src')
console.log(src)
})
apidoc 模块
apidoc用于生成一个REST风格的Web API文档。
安装:npm install apidoc -g
地址:https://apidocjs.com/
生成api文档:apidoc -i ./router -o ./apidoc
说明: 编译当前目录下router文件夹中的所有文件,输出到当前目录下的doc文件夹中
项目根目录创建 apidoc.json
{
“name”: “用户”,
“version”: “0.1.0”,
“description”: “用户登录、注册接口文档”,
“title”: “接口文档”,
“url” : “http://127.0.0.1:3000”
}
注释示例:
/**
* @api {post} /user/login 用户登录
* @apiGroup user
*
* @apiParam {String} user 用户账号
* @apiParam {String} pass 用户密码
*
* @apiSuccessExample 返回数据示例:
* {
* "err": 0,
* "msg": "登录成功"
* }
*/
五、全局变量
__dirname 表示当前执行的脚本所在目录的绝对路径 如:D:\phpstudy_pro\WWW\test\GP03\day33
__filename 表示当前执行的脚本文件的绝对路径 如:D:\phpstudy_pro\WWW\test\GP03\day33\test.js
process是一个全局进程模块
console.log( process.env ) 当前的环境信息
console.log(process.argv[2] ) 获取输入的命令