node
- node运行文件(ctrl+c退出)
$ node <文件名>
- 在node环境执行js代码
命令行输入node进入node环境。两次ctrl+c退出
REPL环境
- R: read
- E: eval
- P:print
- L: loop
创建服务
// 导入模块
const http = require('http')
// 创建服务
const server = http.createServer(function(req, res){
res.end()
})
// 监听端口
server.listen(3000)
createServer()
接受一个参数 回调函数 callback
callback接受两个参数
- 请求 request 客户端 -> 服务器端
- 响应 response 服务器端 -> 客户端
end()
- 结束响应
- 参数可选
- 接收一个参数,可以把它渲染到浏览器上
- 服务端给客户端响应的内容
- 如果没有end,浏览器的刷新一直处于转圈圈的状态,直到超时为止
response.write(data)
- 第一个参数必选
- 服务端给客户端发送的请求主体
writeHead设置请求头(对象)
- 设置响应内容是平文本/html/js
res.writeHead(200,('Content-Type', 'text/plain')
- 设置编码格式UTF-8
res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'})
setHeader(键值对)
- 设置编码格式UTF-8
res.setHeader('Content-Type','text/html; charset=utf-8')
设置cookie
res.setHeader("Set-Cookie",["username=1;password=86400","b=2;max-age=3600"]
优先级:writeHead高于setHeader
请求 request
- request.url 请求地址
- request.method 请求方法
- request.httpVersion http版本号
简单路由跳转
let _url = req.url;
if (_url === '/') {
res.write('<h1>首页</h1>')
res.end()
} else if (_url === '/list'){
res.write('<h1>列表页</h1>')
res.end()
} else if (_url === '/detail'){
res.write('<h1>详情</h1>')
res.end()
} else if (_url === '/order'){
res.write('<h1>订单</h1>')
res.end()
} else {
res.write('<h1>404</h1>')
res.end()
}
listen()
- 第一个参数:监听的端口号
- 第二个参数:监听的IP地址
- 第三个参数:回调函数
querystring()
querystring.parse()
将字符串解析为对象格式,
如:
querystring.parse('username=a&password=123')
//{username:'a',password='123'}
- 第一个参数 必传 要解析的字符串
- 第二个参数 选传 键值对中间的符号,默认是&
- 第三个参数 选传 键和值中间的符号,默认是=
querystring.stringify()
将对象格式解析为字符串,与querystring.parse()作用相反
url模块
url.parse()
将字符串解析成为字符串对象
- 第一个参数 必传 地址字符串
- 第二个参数 可传 url.parse(req.url,true)如果值为true,会将字符串对象的query属性用querystring.parse()转成对象
const http = require('http')
const url = require('url')
http.createServer((req, res) => {
if (req.url == '/favicon.ico') {return}
res.setHeader('Content-Type', 'text/html;charset=utf-8')
let newUrl = url.parse(req.url, true)
let userinfo = newUrl.query
let username = userinfo.username
let password = userinfo.password
if (username === 'admin') {
res.end('<h1>超级管理员</h1>')
} else {
res.end('<h1>普通用户</h1>')
}
}).listen(3000, () => {
console.log('server is running on localhost:3000')
})
GET 和 POST
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form action="http://192.168.0.18:3000/" method="POST" accept-charset="UTF-8">
登录<input name='name' type="text"><br>
注册<input name='password' type="password"><br>
<input class="btn" type="submit" value="提交">
</form>
</body>
</html>
GET
const http = require('http')
const url = require('url')
http.createServer((req, res) => {
if (req.url == '/favicon.ico') {return}
res.setHeader('Content-Type', 'text/html;charset=utf-8')
let newUrl = url.parse(req.url, true)
let userinfo = newUrl.query
let username = userinfo.username
let password = userinfo.password
if (username === 'admin') {
res.end('<h1>超级管理员</h1>')
} else {
res.end('<h1>普通用户</h1>')
}
}).listen(3000, () => {
console.log('server is running on localhost:3000')
})
POST
const http = require('http')
const server = http.createServer()
server.on('request', (req,res) =>{
/*
当有数据提交的时候 会触发data事件
callback接收一个参数 参数 -> buffer对象 -> 转换为字符换 buffer对象.toString()
如果接收的内容非常多,node会将其分割成为小片段,再拼接起来
需要我们在请求结束的时候,再去拿data数据
*/
let str = ''
// 监听请求的数据
req.on('data', function(data) {
str += data.toString()
})
// 监听请求结束的事件
req.on('end', function(){
console.log(str)
})
res.end('ok')
})
server.listen(3000, () => {
console.log('server is running on localhost')
})
buffer
全局环境下的一个对象
处理二进制流数据
toString
将buffer 对象转换为字符串
events
- 引入
const EventEmitter = require('events')
- 继承
class MyEmitter extends EventEmitter {}
- 实例化
const myEmitter = new MyEmitter
const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter
myEmitter.on('xuexi',() => {
console.log('xuexi')
})
myEmitter.emit('xuexi')
fs
两个全局变量
__filename
- 文件的绝对路径
__dirname
- 文件所在文件夹的绝对路径
读文件
fs.readFile(path[, options], callback)
异步读取文件内容
- 必选参数一 文件所在路径
- 必选参数二 错误优先的回调函数
- 参数一 err
- 参数二 返回的数据
const fs = require('fs')
fs.readFile('../src/fs01.txt',(err,data) => {
if(!err){
console.log(data.toString())
}else if (err) {
throw err
}
})
callback采用错误优先机制
fs.readFileSync(path[, options])
返回值是文件的内容
const fs = require('fs')
var data=fs.readFileSync('../src/fs01.txt')
console.log("readFileSync"+data.toString())
写文件
fs.writeFile(file, data[, options], callback)
fs.writeFile('../src/fs01.txt',data,{
flag: 'a+' //写入方式为追加
}, (err) => {
if (err) throw err;
console.log('文件已保存');
})
fs.writeFileSync(file, data[, options])
fs.writeFileSync('../src/fs01.txt', 'data')
options
<Object> | <string>
- encoding
<string> | <null>
默认为 ‘utf8’。- mode
<integer>
默认为 0o666。- flag
<string>
默认为 ‘w’。(写入方式)
爬虫
// axios
// cheerio
// npm安装 npm i axios cheerio --save
const http = require('http')
const axios = require('axios')
const cheerio = require('cheerio')
const server = http.createServer()
//想要爬的网址
const Url = 'https://read.qidian.com/chapter/12sqXj4zfaecikCo3ZPkrg2/7ZLQ7fqZcp1OBDFlr9quQA2/'
server.on('request',(req,res) => {
res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'})
axios
.get(Url)
.then((data)=>{
// console.log(data.data)
const $ = cheerio.load(data.data)
let str=''
let $title = $('.read-content').children()
$title.each((index,item) => {
let title = $(item).text()
str += `${title}<br/>`
})
res.end(str)
})
})
server.listen(3000)