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. how to recursively all files in a folder with sudo permissions in macOS

    how to recursively all files in a folder with sudo permissions in macOS write bug OK sudo chmod 777 ...

  2. nasm 函数返回一个数组 x86

    getArguments.asm: extern VirtualAlloc section .text global dllmain export getArguments dllmain: mov ...

  3. 稳定币USDN的算法调控

    在NGK公链的稳定币系统中,USDN的价格有时会出现一定幅度的波动.正如我们会看到USDT有时会是0.99美元,有时是1.01美元一样.那么,要保障USDN在二级市场的价格基本稳定,要如何调节供需呢? ...

  4. 大小厂必问Java后端面试题(含答案)

    你好,我是yes. 这个系列的文章不会是背诵版,不是那种贴上标准答案,到时候照着答就行的面试题汇总. 我会用大白话尽量用解释性.理解性的语言来回答,但是肯定没有比平时通过一篇文章来讲解清晰,不过我尽量 ...

  5. CPU飙升的问题

    本文转载自CPU飙升的问题 问题发现 事情是这样的,最近小码仔负责的项目预定今天凌晨2点上进行版本更新.前几天测试小姐姐对网站进行压力测试,观察服务的CPU.内存.load.RT.QPS等各种指标. ...

  6. Go的数组

    目录 数组 一.数组的定义 1.声明数组 2.初始化设值 3.指定位置设值 4.不指定长度初始化(了解) 二.数组的使用 三.数组的类型 四.数组的长度 五.迭代数组 1.初始化迭代 2.使用rang ...

  7. 零基础学Python:数据容器

    1.常用操作 列表常用操作 在 ipython 中定义一个 列表,例如: l= list() 输入 l. 按下 TAB 键, ipython 会提示 字典 能够使用的函数如下: 可以到官方网址查询使用 ...

  8. 微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法

    微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法 具体情况: scroll-view 滚动,设置 display:flex 不生效并警告设置 enable-fl ...

  9. MySql_176. 第二高的薪水 + limit + distinct + null

    MySql_176. 第二高的薪水 LeetCode_MySql_176 题目描述 题解分析 代码实现 # Write your MySQL query statement below select( ...

  10. POJ-1458(LCS:最长公共子序列模板题)

    Common Subsequence POJ-1458 //最长公共子序列问题 #include<iostream> #include<algorithm> #include& ...