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代码测试 不建 ...
随机推荐
- Protocol Buffers All In One
Protocol Buffers All In One Protocol Buffers - Google's data interchange format Protocol buffers are ...
- prototype chain & prototype & __proto__
prototype chain & prototype & proto prototype chain MDN https://developer.mozilla.org/en-US/ ...
- 二叉搜索树 & 二叉树 & 遍历方法
二叉搜索树 & 二叉树 & 遍历方法 二叉搜索树 BST / binary search tree https://en.wikipedia.org/wiki/Binary_searc ...
- website i18n and L10n all in one
website i18n and L10n all in one Localization & Internationalization 本地化 & 国际化 https://www.w ...
- Android Studio & SDK & JDK & setting path
Android Studio & SDK & JDK & setting path https://developer.android.com/studio/intro/upd ...
- OLAP
OLAP Online Analytical Processing https://en.wikipedia.org/wiki/Online_analytical_processing 在线分析处理 ...
- Java中print、printf、println的区别
Java中print.printf.println的区别 区别 print:标准输出,但不换行,不可以空参: println:标准输出,但会自动换行,可以空参,可以看做:println()相当于pri ...
- 链表、栈、队列、KMP相关知识点
链表.栈与队列.kmp; 数组模拟单链表: 用的最多的是邻接表--就是多个单链表: 作用:存储树与图 需要明确相关定义: 为什么需要使用数组模拟链表 比使用结构体 或者类来说 速度更快 代码简洁 算法 ...
- 数据归一化 scikit-learn中的Scaler
1 import numpy as np 2 from sklearn import datasets 3 4 # 获取数据 5 iris = datasets.load_iris() 6 X = i ...
- molloc堆区的动态内存分配
[前言]前面有一篇文章介绍了堆区栈区的区别.栈区的核心主要集中在操作一个栈结构,一般由操作系统维护.堆区,主要是我们程序员来维护,核心就是动态内存分配. 这篇笔记结束就不在高新CSAPP的读书笔记了, ...