nodeJS详解2
Nodejs应用场景
- 创建应用服务
- web开发
- 接口开发
- 客户端应用工具 gulp webpack vue脚手架 react脚手架 小程序
NodeJs基于 Commonjs模块化开发的规范,它定义一个JS文件就称之为一个模块
一、模块导入
CommonJS
ES6
二、Node语法
1、os模块
2、path模块
3、url模块
4、querystring模块
5、fs模块
6、全局变量
7、http模块
8、nrm管理npm镜像源
9、nodemon自动重启node
写个案例串联一下知识点
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、路由
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')
})
nodeJS详解2的更多相关文章
- Nodejs this详解
[Nodejs this详解] Nodejs中, 文件层this,指向的是module.export. 函数层this,指向的是global对象. 参考:http://www.jb51.net/art ...
- 详解nodejs中使用socket的私聊和公聊的办法
详解nodejs中使用socket的私聊和公聊的办法 nodejs的应用中,关于socket应该是比较出彩的了,socket.io在github上有几万人的star,它的成功应该是不输于express ...
- nodejs事件和事件循环详解
目录 简介 nodejs中的事件循环 phase详解 timers pending callbacks idle, prepare poll轮询 check close callbacks setTi ...
- nodejs QueryString模块 详解
QueryString模块 "QueryString" 模块用于实现URL参数字符串与参数对象的互相转换 此类一共包括4个方法: querystring.stringify(obj ...
- Node.js npm 详解
一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...
- 源映射(Source Map)详解
一.什么是源映射 为了提高性能,很多站点都会先压缩 JavaScript 代码然后上线, 但如果代码运行时出现错误,浏览器只会显示在已压缩的代码中的位置,很难确定真正的源码错误位置. 这时源映射就登场 ...
- 《Node.js开发实战详解》学习笔记
<Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...
- NoSQL之Redis高级实用命令详解--安全和主从复制
Android IOS JavaScript HTML5 CSS jQuery Python PHP NodeJS Java Spring MySQL MongoDB Redis NOSQL Vim ...
- 测试框架mochajs详解
测试框架mochajs详解 章节目录 关于单元测试的想法 mocha单元测试框架简介 安装mocha 一个简单的例子 mocha支持的断言模块 同步代码测试 异步代码测试 promise代码测试 不建 ...
随机推荐
- Linux 驱动框架---驱动中的中断
在单片机开发中中断就是执行过程中发生了一些事件需要及时处理,所以需要停止当前正在运行的处理的事情转而去执行中断服务函数,已完成必要的事件的处理.在Linux中断一样是如此使用但是基于常见的中断控制器的 ...
- 006.NET 项目建立+传值
1. 创建项目 2.传值(控制器向视图传递) 接收值 3.视图向控制器传递 4.session配置
- Virtualbox 安装centos7虚拟机
Virtualbox 安装centos7虚拟机 一,下载centos7 下载地址:https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x ...
- FTP 与 SSH 的安全性对比, 以及FTP,SSH,SFTP,SCP 的关系简单解析!
FTP 与 SSH 的安全性对比? ftP: http://baike.baidu.com/subview/369/6149695.htm TCP/IP协议中,FTP标准命令TCP端口号为21,Por ...
- 2020 Google 开发者大会
2020 Google 开发者大会 Google Developer Summit https://developersummit.googlecnapps.cn/ Flutter | Web | M ...
- Publish/Subscribe Pattern & Vanilla JavaScript
Publish/Subscribe Pattern & Vanilla JavaScript https://en.wikipedia.org/wiki/Publish–subscribe_p ...
- Flutter CodePen challenges
Flutter CodePen challenges 挑战赛 https://mp.weixin.qq.com/s/qIYokWN9SVgr-F7YxbJuOQ CodePen Flutter 编辑器 ...
- infinite auto load more & infinite scroll & load more
infinite auto load more & infinite scroll & load more https://codepen.io/xgqfrms/pen/NZVvGM ...
- 2021-2-19:请问你知道 Java 如何高性能操作文件么?
一般高性能的涉及到存储框架,例如 RocketMQ,Kafka 这种消息队列,存储日志的时候,都是通过 Java File MMAP 实现的,那么什么是 Java File MMAP 呢? 什么是 J ...
- ToolBar 用法
xml中的设置: <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_wi ...