3. url模块
我们发现请求的url带有 ?等传参的时候,我们要学习的是对这个传来的参数的处理,这就要用到本小节的url模块了。
parse( ) 方法
url模块的parse()方法会对请求的url进行解析,解析成一个Url对象
const url = require('url') const urlString = 'https://www.baidu.com:443/ad/index.html?id=8&name=mouse#tag=110' //parse()方法会对请求的url进行解析,解析成一个Url对象 const parsedStr = url.parse(urlString) console.log(parsedStr)
我们看到Url对象里的属性有非常多,我们通过这些属性就可以对路径和参数进行操作。
format( ) 方法
如果你有一个Url对象的话,url的format( )
方法就可以把这个对象格式化成url地址。
const url = require('url') const urlObject = { protocol: 'https:', slashes: true, auth: null, host: 'www.baidu.com:443', port: '443', hostname: 'www.baidu.com', hash: '#tag=110', search: '?id=8&name=mouse', query: { id: '8', name: 'mouse' }, pathname: '/ad/index.html', path: '/ad/index.html?id=8&name=mouse' } const parsedObj = url.format(urlObject) console.log(parsedObj)
resolve( ) 方法
resolve( )
方法的作用是可以进行url的拼接。
const url = require('url') // 注意结尾加 / 和不加 / 的区别 let a = url.resolve('/one/two/three', 'four') let b = url.resolve('/one/two/three/', 'four') let c = url.resolve('http://example.com/', '/one') let d = url.resolve('http://example.com/one', '/two') console.log(a + "," + b + "," + c)
上面这些是Node.js旧版url模块的API,很多方法都被遗弃了,我们下面学习一下新版API的用法。
new URL( )
传入两个参数,第一个参数是要解析的绝对或相对的输入网址。如果第一个路径是相对的,则需要 第二个参数。第二个阐述为基本的url地址。
const myURL = new URL('/foo?a=1&b=2', 'https://example.org/'); console.log(myURL)
4. querystring模块
querystring 模块提供了用于解析和格式化网址查询字符串的实用工具。 querystring API 被视为旧版的,官方还在维护。它既然存在过,我们也有必要来学习一下这个模块。
parse( ) 方法
这个方法可以把查询字符串,转化为一个对象
const querystring = require('querystring') let qs = 'x=3&y=4' let parsed = querystring.parse(qs) console.log(parsed)
stringify( ) 方法
这个方法和上面的parse()方法的用法相反
const querystring = require('querystring') let qo = { x: 3, y: 4 } let parsed = querystring.stringify(qo) console.log(parsed)
5. http模块补充知识点
json形式的接口
我们上面案例里面用res.write()
向浏览器返回html标签数据,其实我们还可以向浏览器返回json数据的。
const http = require('http') const url = require('url') const app = http.createServer((req, res) => { let urlObj = url.parse(req.url, true) switch (urlObj.pathname) { case '/api/user': res.end(`{"name": "haiexijun","age":"20"}`) break default: res.end('404 not found') break } }) app.listen(8080, () => { console.log('start server') })
跨域:CORS
res.writeHead(200, { 'content-type': 'application/json;charset=utf-8', 'Access-Control-Allow-Origin': '*' })
执行 GET 请求
有些时候,前端无法跨域去请求数据。而Node.js却可以实现跨域请求数据。所以Node.js常常位于前端和后端中间,帮前端请求后端数据。所以node.js往往用于做中间层。这样就跨域去请求别人网站上的数据,然后为自己所用,比如爬虫等。
下面我们来用Node.js来get请求获取数据:
const https = require('https') let datas = '' //因为要请求的数据时https的,所以也要用https模块请求 https.get("https://img-home.csdnimg.cn/data_json/toolbar/toolbar1105.json",response => { //node.js是对数据一部分一部分获取的 //请求数据,触发node.js的data事件时,会调用后面定义的回调函数对数据进行拼接 response.on('data',(chunk)=>{ datas += chunk }) //当Node.js请求完数据时,会触发end事件,调用后面定义的的回调函数。 response.on('end',()=>{ console.log(datas) }) })
我们启动服务后看到控制台输出了请求过来的数据:
POST请求其实大同小异,只是用的方法不一样而已,POST请求用https.request
方法进行请求。
const https = require('https') //请求的数据要转成json格式 const datas = JSON.stringify({ todo: '做点事情' }) const options = { hostname: 'nodejs.cn', port: 443, path: '/todos', method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': data.length } } const req = https.request(options, res => { res.on('data', (chunk) => { dada+=chunk }) }) req.on('end', () => { console.error(error) }) //请求的数据datas要writey发出去哦!! req.write(data) req.end()
其实除了用Node.js的内部模块发http请求意外,还可以用第三方模块来发送请求,比如我们常用的axios。
6. event事件模块
events 模块为提供了 EventEmitter
类,这是在 Node.js 中处理事件的关键。
const EventEmitter = require('events') //new EventEmitter()构造函数来创建event对象 const event = new EventEmitter(); //on()添加当事件被触发时调用的回调函数。 event.on('play',()=>{ console.log("play事件触发了") }) // emit()触发事件, 按照事件被注册的顺序同步地调用每个事件监听器。 event.emit("play")
EventEmitter
对象还有很多方法,这里就不多解释了。你只要知道event模块能干什么就好,用到的时候再去查吧。
7. fs文件操作模块
要对文件进行操作,先要引入fs
模块。
const fs = require('fs')
文件夹的操作
(1) 创建新的文件夹 :使用 fs.mkdir()
或 fs.mkdirSync()
可以创建新的文件夹。
const fs = require('fs') //方法传入两个参数,第一个参数是路径,可以是绝对路径,也可以是相对路径 //第二个参数是错误时的回调 fs.mkdir("./test",(err)=>{ console.log(err) })
fs.mkdirSync() 是同步的版本,要用try catch捕获异常,而不是回调:
const fs = require('fs') const folderName = './test' try { if (!fs.existsSync(folderName)) { fs.mkdirSync(folderName) } } catch (err) { console.error(err) }
(2) 查看文件夹或文件是否存在:使用fs.existsSync( )传入文件或文件夹的名称就好了。会返回一个布尔值。
const fs = require('fs') isExist=fs.existsSync("./test") console.log(isExist)
(3) 读取目录的内容 :使用 fs.readdir() 或 fs.readdirSync() 可以读取目录的内容。
下面这段代码会读取文件夹的内容(全部的文件和子文件夹),并返回它们的相对路径:
const fs = require('fs') const path = require('path') const folderPath = './test' console.log(fs.readdirSync(folderPath))
(4) 重命名文件夹 :使用 fs.rename()
或 fs.renameSync()
可以重命名文件夹。 第一个参数是当前的路径,第二个参数是新的路径。
const fs = require('fs') fs.rename('./test', './haiexijun', err => { if (err) { console.error(err) return } })
fs.renameSync() 是同步的版本,要用try catch捕获异常,而不是回调:
const fs = require('fs') try { fs.renameSync('./test', './haiexijun') } catch (err) { console.error(err) }