nodeJS基础2
Nodejs应用场景
- 创建应用服务
- web开发
- 接口开发
- 客户端应用工具 gulp webpack vue脚手架 react脚手架 小程序
NodeJs基于 Commonjs模块化开发的规范,它定义一个JS文件就称之为一个模块
一、模块导入
CommonJS
导出:module.exports.name 导入:require var exports = module.exports; // a.js exports = function a() {}; // b.js const a = require('./a.js') // a 是一个空对象ES6
导出:export {} export default function(){} export const function(){} 导入:import二、Node语法
1、os模块
const os=require('os') os.cpus() cpu参数 os.totalmem() 内存大小 os.freemem() 内存剩余大小2、path模块
const path = require('path') path.basename('路径') 文件名称 path.dirname(路径) 文件路径 path.extname('路径') 文件扩展名 path.join('/a','b','c') 路径拼接3、url模块
const url = require('url') const href = '//www.baidu.com/a/b/c/d/a.html?id=100&name=zhangsan#hash' let { pathname, query } = url.parse(href, true, false) 参数1:url地址 参数2:让query转化为对象 参数3:如果url地址中没有协议则为true时可以得到host相关信息,而默认false将得不到host相关信不影响我们获取query中的参数4、querystring模块
const querystring=require('querystring') querystring.parse('foo=99&abc=tt') //字符串转对象 querystring.stringify({foo:'cc',abc:'pp'}) //对象转字符串5、fs模块
const fs = require('fs') fs.writeFile('文件路径',data,err=>{}) //文件写入 fs.readFile('文件路径','utf8',(err,data)=>{}) //文件读取 fs.existSync(path) //文件检测true/flase fs.stat('文件路径',(err,stats)=>{ stats.isDirectory() //是否是目录 stats.isFile() //是否为文件 stats.size //文件大小 }) fs.unlink('文件路径',err=>{}) //删除文件6、全局变量
global 类似于js的window __filename 文件名称 __dirname 目录7、http模块
一、导入 const http=require('http') 二、创建服务 const server = http.createServer() 三、请求 server.on('request',(request,response)=>{ request:请求对象 request.url 地址 reuest.method 方式get、post.. req.headers 请求头 response:响应对象 response.setHeader() 设置响应头 res.statusCod =200 状态 res.end() 发送数据 }) 四、启动服务 server.listen(8080,()=>{})8、nrm管理npm镜像源
安装:npm i nrm -g 查看:nrm ls 切换:nrm use 名称9、nodemon自动重启node
npm i nodemon -g nodemon app.js写个案例串联一下知识点
const http=require('http')
const server=http.createServer()
const path=require('path')
const fs=require('fs')
const url=require('url')
// const queryString=require('queryString')
const webroot=path.join(__dirname,'src')
const nofont=path.join(webroot,'nofont.html')
server.on('request',(req,res)=>{
let uri=req.url //请求地址
let {pathname,query}=url.parse(uri,true)
pathname=pathname=='/'?'/index.html':pathname
if('favicon.ico'!=pathname){
let filepath=path.join(webroot,pathname)
fs.readFile(filepath,"utf-8",(err,data)=>{
if(err){
res.end(fs.readFileSync(nofont))
}else{
res.end(data)
}
})
}
})
server.listen(8090,()=>{
console.log('is ok server')
})
再写一个练习一下post和get用法
const http = require('http')
const path = require('path')
const fs = require('fs')
const url = require('url')
const querystring = require('querystring')
const webroot = path.join(__dirname, 'src')
http.createServer((req, res) => {
let uri = req.url
let { pathName, query } = url.parse(uri, true)
let extname = path.extname(pathName)
if ('favicon.ico' != pathName && req.method == 'GET') {
pathName = pathName == '/' ? 'index.html' : pathName
}
// 设置文件路径。针对非html文件
let filepath = path.join(webroot, pathName)
if ('.html' == extname) {
filepath = path.join(webroot, 'src', pathName)
fs.readFileSync(filepath, 'utf-8', (err, data) => {
if (err) {
res.statusCode = 404
res.end('not found')
} else {
res.end(data)
}
})
}else{
switch(pathName){
case '/login':
let data=''
req.on('data',chunk=>data+=chunk)
req.on('end',()=>{
res.end('post')
})
break;
case '/news':
let data=[]
req.on('data',chunk=>data.push(chunk))
req.on('end',()=>{
let postData=Buffer.concat(data).toString()
res.end(post)
})
break;
default:
res.end('not')
}
}
}).listen(8082,()=>{
console.log('post or get')
})
三、express模块
1、下载 npm i express -S
2、基本操作
const express = require('express')
// ① 创建服务
const app = express()
/*
② 监听get
req:请求对象
res:响应对象
res.send():向客户端发送相应数据
*/
app.get('请求url', (req, res) => {
res.send({
id: '1',
name: 'll'
})
})
/*
③ 启动服务
命令查看启动是否成功: netstat -ano |findstr 8080
mac/linux:netstat -tunp | grep 8080
*/
app.listen(8080,()=>{})
/*
1、use 类似于路由守卫
作用:接收所有请求,
next:是否向下执行
接受所有请求,有一个next参数,此参数定义是否向下执行 路由规则
参数1: 空 前面的所有规则必须符合
不为空 前面的单一正确即可
参数2:回调函数
1、请求
2、响应
3、是否向下执行
app.use('', (req, res, next) => {
next(); //处理结束,向下执行,直接匹配到定义了的规则
})
*/
app.use((req,res,next)=>{
next()
})
/*
2、参数的获取
get值: req.query
动态参数值: req.params
post值: req.body
*/
// 路由参数:api/detail/100/zzhh
app.get('api/detail/:id/:name',(req,res)=>{
let {id,name}=req.params
res.send(name,id)
})
/*
3、静态资源托管
express提供了一个非常好用的方法,叫做 express.static(),通过此方法,可以非常方便地创建一个静态web资源服务器
app.use(express.static('public'))
现在可以访问public目录下所有的文件
如public/aa.jpg文件,则可以通过 : http://xxxx/images/aa.jpg
挂载路径前缀,希望是访问到指定的路径后才触发到静态资源管理
app.use('public', express.static('public'))
如public/aa.jpg文件,则可以通过 : http://xxxx/public/images/aa.jpg
*/
// 访问public下的内容
app.use(express.static('public'))
app.use('public', express.static('public'))
// 44处理
app.use((req,res,next)=>{
res.statusCode=404
res.send('页面丢了')
})
3、路由
route.js中 const express=require('express')
const router=express.Router()
router.get('/kk',(req,res)=>{
res.send('')
})
module.exports=router
引入路由
const express=require('express')
const app=express()
app.listen(8080)
app.use(require('./route.js'))
4、中间件
自定义中间件err.js
// 错误级别中间件 const express=require('express') const fs=require('fs') const path=require('path') const app=express app.listen(8080) app.get('/',(req,res)=>{ let filepath = path.join(__dirname,'html','index.html') try { let html=fs.readFileSync(filepath) res.send(html) } catch (error) { throw new Error('读取失败') } }) // 用户模块 app.get('/user',(req,res)=>{ let username=req.query.username if(username!='admin'){ throw new Error('非法用户') }else{ res.send('成功') } }) app.use((err,req,res,next)=>{ res.status(500).send(err.message) })
自定义函数中间件
const express=require('express')
const app=express()
app.listen(8088)
const islogin=(req,res,next)=>{
let username=req.query.username
if(username=='1amin'){
next()
}else{
next(err)
}
}
const logined=(req,res,next)=>{
req.nickname='lll'
next()
}
const login=[islogin,logined]
app.get('/login',login,(req,res)=>{
res.send('用户中心'+req.nickname)
})
app.use((err,req,res,next)=>{
res.status(401).send('非法登录')
})
// 内置中间件 app.use(express.static('public'))
第三方中间件
// 第三方中间件用于读取表单提交数据 npm i -S body-parser const express=require('express') const bodyPaser=require('body-parser') const app=express() app.listen(8085) app.use(express.static('html')) /* 用于post数据接收 */ app.use(bodyPaser.urlencoded({extended:false})) app.post('/login',(req,res)=>{ console.log(req.body) res.send('') })
5、cookie
// npm i -S cookie-parser const express=require('express') const bodyPaser = require('body-parser') const cookieParser=require('cookie-parser') const app=express() app.listen(8085) app.use(express.static('../src')) app.use(bodyPaser.urlencoded({extended:false})) app.use(cookieParser()) app.get('/a',(req,res)=>{ // 写入cookie 设置过期时间五分钟 res.cookie('userbane',['zhangshan','pp'],{maxAge:5*60*1000}) res.send('ok') }) app.get('/b',(req,res)=>{ console.log(req.cookies) res.send(req.cookies) })
6、session
// npm i -S cookie-session const express = require('express') const cookieSession =require('cookie-session') const app=express() app.listen(8086) app.use(express.static('../src')) app.use(cookieSession({ name:'sessionId', secret:'sad加密', maxAge:10*60*1000 })) app.get('/',(req,res)=>{ // 写session if(!req.session.view){ req.session.view=1 }else{ req.session['view']++ } res.send('访问了此页'+req.session.view+'次') })
四、express与mongodb
const express = require('express')
const mongoose=require('mongoose')
const app=express()
app.listen(8285)
/*
1、链接数据库
兼容高版本
协议,域名,端口号,库名
*/
mongoose.connect('mongodb://localhost:27017/mydemo',{useNewUrlParser:true,useUnifiedTopology:true})
app.get('/',(req,res)=>{
res.send('数据库')
})
/*
2、定义scamer
数据表结构的定义;每个schema会映射到mongodb中的一个集合
*/
var useSchema=new mongoose.Schema({
name:{
type:String,
minlength:2,
require:true
},
id:String
})
/*
3、model数据炒作
model名称
schema名称
操作的数据集合 没有则以1的形式(表明)
*/
const userModel=mongoose.model('user',useSchema,'user')
userModel.find().then(res=>{
console.log(res,'sss')
})