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')
})

浙公网安备 33010602011771号