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. Linux 驱动框架---驱动中的中断

    在单片机开发中中断就是执行过程中发生了一些事件需要及时处理,所以需要停止当前正在运行的处理的事情转而去执行中断服务函数,已完成必要的事件的处理.在Linux中断一样是如此使用但是基于常见的中断控制器的 ...

  2. 006.NET 项目建立+传值

    1. 创建项目 2.传值(控制器向视图传递) 接收值 3.视图向控制器传递 4.session配置

  3. Virtualbox 安装centos7虚拟机

    Virtualbox 安装centos7虚拟机 一,下载centos7 下载地址:https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x ...

  4. FTP 与 SSH 的安全性对比, 以及FTP,SSH,SFTP,SCP 的关系简单解析!

    FTP 与 SSH 的安全性对比? ftP: http://baike.baidu.com/subview/369/6149695.htm TCP/IP协议中,FTP标准命令TCP端口号为21,Por ...

  5. 2020 Google 开发者大会

    2020 Google 开发者大会 Google Developer Summit https://developersummit.googlecnapps.cn/ Flutter | Web | M ...

  6. Publish/Subscribe Pattern & Vanilla JavaScript

    Publish/Subscribe Pattern & Vanilla JavaScript https://en.wikipedia.org/wiki/Publish–subscribe_p ...

  7. Flutter CodePen challenges

    Flutter CodePen challenges 挑战赛 https://mp.weixin.qq.com/s/qIYokWN9SVgr-F7YxbJuOQ CodePen Flutter 编辑器 ...

  8. infinite auto load more & infinite scroll & load more

    infinite auto load more & infinite scroll & load more https://codepen.io/xgqfrms/pen/NZVvGM ...

  9. 2021-2-19:请问你知道 Java 如何高性能操作文件么?

    一般高性能的涉及到存储框架,例如 RocketMQ,Kafka 这种消息队列,存储日志的时候,都是通过 Java File MMAP 实现的,那么什么是 Java File MMAP 呢? 什么是 J ...

  10. ToolBar 用法

    xml中的设置: <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_wi ...