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

nodeJS详解2的更多相关文章

  1. Nodejs this详解

    [Nodejs this详解] Nodejs中, 文件层this,指向的是module.export. 函数层this,指向的是global对象. 参考:http://www.jb51.net/art ...

  2. 详解nodejs中使用socket的私聊和公聊的办法

    详解nodejs中使用socket的私聊和公聊的办法 nodejs的应用中,关于socket应该是比较出彩的了,socket.io在github上有几万人的star,它的成功应该是不输于express ...

  3. nodejs事件和事件循环详解

    目录 简介 nodejs中的事件循环 phase详解 timers pending callbacks idle, prepare poll轮询 check close callbacks setTi ...

  4. nodejs QueryString模块 详解

    QueryString模块 "QueryString" 模块用于实现URL参数字符串与参数对象的互相转换 此类一共包括4个方法: querystring.stringify(obj ...

  5. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

  6. 源映射(Source Map)详解

    一.什么是源映射 为了提高性能,很多站点都会先压缩 JavaScript 代码然后上线, 但如果代码运行时出现错误,浏览器只会显示在已压缩的代码中的位置,很难确定真正的源码错误位置. 这时源映射就登场 ...

  7. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

  8. NoSQL之Redis高级实用命令详解--安全和主从复制

    Android IOS JavaScript HTML5 CSS jQuery Python PHP NodeJS Java Spring MySQL MongoDB Redis NOSQL Vim ...

  9. 测试框架mochajs详解

    测试框架mochajs详解 章节目录 关于单元测试的想法 mocha单元测试框架简介 安装mocha 一个简单的例子 mocha支持的断言模块 同步代码测试 异步代码测试 promise代码测试 不建 ...

随机推荐

  1. Python对excel的基本操作

    Python对excel的基本操作 目录 1. 前言 2. 实验环境 3. 基本操作 3.1 安装openpyxl第三方库 3.2 新建工作簿 3.2.1 新创建工作簿 3.2.2 缺省工作表 3.2 ...

  2. 101道Numpy、Pandas练习题

    无论是数据分析还是机器学习,数据的预处理必不可少. 其中最常用.最基础的Python库非numpy和pandas莫属,很多初学者可能看了很多教程,但是很快就把用法忘光了. 光看不练假把式,今天向大家推 ...

  3. CSS :nth-of-type() bug

    CSS :nth-of-type() bug .tools-hover-box-list-item { pointer-events: auto; box-sizing: border-box; di ...

  4. svg-path-to-polygons & svg-path-parser

    svg-path-to-polygons & svg-path-parser svg-path-to-polygons https://www.npmjs.com/package/svg-pa ...

  5. 高倍币VAST,如何破局NGK算力市场?

    2020年,全球经济危机的爆发,无疑是给全球经济蒙上了一层阴影.而世界主要经济体也开启了无节制的放水,通过一轮又一轮的宽松货币政策,以刺激经济的发展.然而宽松的货币政策也加速了以美元为首的货币贬值,同 ...

  6. 百万SPC即将空投,3.0公链NGK有多“豪横”?

    在1月2日晚间,比特币强势突破3万美金,随后还在一路上涨,现在价格33431.64美金.仅用了不到一个月的时间,比特币就从2万美金涨到了3万美金,这充分展示了市场对于数字货币的强烈信心.没有了天花板的 ...

  7. JIT原理

    本文转载自JVM杂谈之JIT 导语 JIT技术是JVM中最重要的核心模块之一.我的课程里本来没有计划这一篇,但因为不断有朋友问起,Java到底是怎么运行的?既然Hotspot是C++写的,那Java是 ...

  8. react小白笔记

    diff算法主要是同级比较,生成数组,进行数组替换 reducer可以接收state,但是绝不能修改state 纯函数指的是:给固定收入,就一定有固定的输出,而且不会有任何副作用[不能例如:new d ...

  9. Java Socket编程基础及深入讲解

    原文链接:https://www.cnblogs.com/yiwangzhibujian/p/7107785.html 原文写的特别好,非常详细,但是禁止转载,那我就不再复制粘贴了! socket实现 ...

  10. C语言:贪心算法之装箱问题

    #include <stdio.h> #include <stdlib.h> #define N 6 #define V 100 typedef struct box // 使 ...