node(Express+Sequelize)

官方网址

一、入门案例

const os = require('os');

// 获取系统的cpu的信息
const cpus = os.cpus(); // 获取当前系统的cpu的数量
console.log(cpus.length);

// 获取内存的信息
const total = os.totalmem(); // bytes
console.log(total/1024/1024/1024); // GB

// 剩余内存
const free = os.freemem();
console.log(free/1024/1024/1024); // GB
// web服务
// ajax -> api -> web server(nodejs)

const http = require('http');

const server = http.createServer((req,res)=>{
    res.end('hello');
});

server.listen(3000,'127.0.0.1',()=>{
    console.log('服务启动成功!');
});

二、nodemon(热加载)

开发时,修改代码后,需要频繁重启项目。nodemon配置热加载,解决了重复启动的问题。

const http = require('http');

const server = http.createServer((req,res)=>{
    res.end('hello');
});

server.listen(3000,'127.0.0.1',()=>{
    console.log('服务启动成功!');
});
{
  "name": "admin-api-demo",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "start": "node app.js",	# 添加此句 可用 npm start启动项目
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {  
    "body-parser": "^1.19.0",
    "cookie-parser": "^1.4.5",
    "express": "^4.17.1",
    "multer": "^1.4.2",
    "mysql": "^2.18.1"
  }
}

1、安装配置

# -D:安装在开发环境
npm install nodemon -D

# 修改 package.json 中 "start": "node app.js" 改为
"start": "nodemon app.js"

# 重启命令(nodemon也可自动重启,因为配置了监听 watching:*.*)
rs

2、配置nodemon.json

因为项目中不需要监听全部文件,避免没必要的重启,所以配置nodemon.json。

指定要监听的目录,只有该目录下的文件被改动,nodemon才会重启项目。

{
    "watch":["./src/**/*.*"]
}

三、nrm(管理npm源)

1、安装

npm install nrm -g

2、常用命令

# 列出npm源列表
nrm ls

# 查看当前使用的源
nrm current

# 切换源 -- 比如切换到taobao
nrm use taobao

# 添加自定义源
nrm add <registry> <url> [home]

四、nvm(管理nodejs版本)

  • Mac/Liunx -- nvm
  • Windows -- nvm-windows

1、下载nvm-windows

:如果在安装nvm-windows之前安装过nodejs。

​ 安装过程中则会提示"你希望nvm管理已经安装的 node 版本吗?"。

​ 选择"是"即可

2、使用

# 列出可安装的版本
nvm list available

# 列出已安装的版本
nvm list

# 安装指定的版本的nodejs,例如
nvm install 10.15.0

# 使用指定版本的nodejs,例如
nvm use 10.15.0

五、Express

1、初始化项目

# 创建myapp目录
mkdir myapp

# 进入myapp目录
cd myapp

# 生成 package.json 文件
npm init

# 将入口改为app.js

2、安装express

npm install express --save

# 以下几个重要模块需要与 express 框架一起安装

# node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。
npm install body-parser --save

# 解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。
npm install cookie-parser --save

# node.js 中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。
npm install multer --save

3、简单服务

// 导入express
const express = require('express');
// express实例
var app = express();

// get请求
app.get('/getName/:age',(req,res)=>{

  let {age} = req.params;
  
  res.json({
     name:'张get',
     age
  });
});

// post请求
app.post('/getName',(req,res)=>{
    res.send('张post')
});

app.listen(3000,()=>{
  console.log('服务已经启动。。。');
});

六、Route(路由)

// 导入express
const express = require('express');
// express实例
var app = express();

// 1、通过请求的方法类型 get/post/put/delete
app.get('/demo',(req,res)=>{
    // req:请求对象
    // res:服务器响应对象
    res.json({
        message:'hello get'
    })
})

app.post('/demo',(req,res)=>{
    res.json({
        message:'hello post'
    })
})

// 2、通过uri
app.get('/user/byname',(req,res)=>{
	let {name} = req.query;
    res.json({
        name
    })
})

app.get('/user/byid',(req,res)=>{
	let {id} = req.query;
    res.json({
        id
    })
})

app.listen(3000,()=>{
  console.log('服务已经启动。。。');
});

1、app.all

1.1、场景一

满足客户端无论使用什么请求方式都可以得到响应

// 导入express
const express = require('express');
// express实例
var app = express();

app.all('/demo',(req,res)=>{
    res.json({
        message:'hello get'
    })
})

app.listen(3000,()=>{
  console.log('服务已经启动。。。');
});

1.2、场景二

无论客户端使用任何uri都可以响应

// 导入express
const express = require('express');
// express实例
var app = express();

app.all('*',(req,res)=>{
    res.json({
        message: 'demo',
        method: req.method,
        uri: req.path
    })
})

app.listen(3000,()=>{
  console.log('服务已经启动。。。');
});

2、app.use

以上两个场景也可通过use实现。不过一般use作为中间件使用。

3、路由拆分

// member.router.js
// 导入express
const express = require('express');
// 创建路由
const router = express.Router();

router.get('/list',(req,res)=>{
    res.json({
        list:[
            id:001,
            name:'李四'
        ]
    })
})

module.exports = router;
// sku.router.js
// 导入express
const express = require('express');
// 创建路由
const router = express.Router();

router.get('/list',(req,res)=>{
    res.json({
        list:[
            name:'鞋子'
        ]
    })
})

module.exports = router;
// 导入express
const express = require('express');
// express实例
var app = express();

// 注册路由
const memberRouter = require('./member.router');
const skuRouter = require('./sku.router');

app.use('/member',memberRouter);	// 访问:member/list
app.use('/sku',skuRouter); // 访问:sku/list

app.listen(3000,()=>{
  console.log('服务已经启动。。。');
});

七、express中间件

1、中间件完整结构

  • 是一个函数
  • 2、err,req,res,next -> function
// 导入express
const express = require('express');
// express实例
var app = express();

// 中间件完整的结构
// 1、是一个函数
// 2、err,req,res,next -> function

function demo_middleware(err,req,res,next){
    // 1、异常处理
    // 2、处理业务功能,然后转交控制权 -- next
    // 3、响应请求 -- 结束响应 --> 当作路由的处理函数
}

function valid_name_middleware(req,res,next){
    let {name} = req.query;
    if(!name || name.length){
        res.json({
            message:'缺少name参数'
        })
    }else{
        next();
    }
}

// 匹配1
app.all('*',valid_name_middleware);

// 匹配2
app.get('/test',(req,res)=>{
    res.json({
        message:'test'
    })
})

app.listen(3000,()=>{
  console.log('服务已经启动。。。');
});

2、中间件各级别的使用

  • app (应用)级别的使用

    • 注册的使用,一定在最顶级

    • app.use --> api加载

      // 导入express
      const express = require('express');
      // express实例
      var app = express();
      
      function log_middleware(req,res,next){
          console.log('请求来了。。。');
          next();
      }
      
      // app级别使用
      app.use(log_middleware);
      
      // 加载 static 的中间件(内置)
      // 获取static目录下的静态文件
      app.use(express.static('static',{
          // 如果请求没有后缀,自动加默认后缀
          extensions:['html','htm']
      }))
      
      app.listen(3000,()=>{
        console.log('服务已经启动。。。');
      });
      
  • router 级别

    // user_router
    // 导入express
    const express = require('express');
    // 创建路由
    const router = express.Router();
    
    router.use(function(req,res,next){
        console.log('log from router');
        next();
    })
    
    // 路由内部使用
    router.get('/demo',[/** middleware */],(req,res)=>{
        res.json({
           message:'from route demo'
        })
    })
    
    module.exports = router;
    
    // 导入express
    const express = require('express');
    // 注册路由
    const userRouter = require('./router/user_router');
    // express实例
    var app = express();
    
    // router级别使用
    
    
    app.use('/user',userRouter);
    
    app.listen(3000,()=>{
      console.log('服务已经启动。。。');
    });
    
  • 异常处理

八、异常处理

// 导入express
const express = require('express');
// express实例
var app = express();

app.get('/demo',(req,res)=>{
   throw new Error('测试异常');
});

// 中间件
function error_handler_middleware(err,req,res,next){
    if(err){
        let {message} = err;
        res.status(500);
        .json({
            message: `${message || '服务器异常'}`
        })
    }
}

// 404处理
function not_found_handler(req,res,next){
    res.json({
        message:'api不存在'
    })
}

app.use(not_found_handler);	// 先判断此异常
app.use(error_handler_middleware);	// 最后判断此异常

app.listen(3000,()=>{
  console.log('服务已经启动。。。');
});

九、Sequelize

1、安装

# 安装
npm install sequelize -S
npm install sequelize-cli -S
npm install mysql2 -S

npx sequelize-cli init

2、配置

  • 修改config目录下的config.json文件

3、创建数据模型

npx sequelize-cli 
model:generate 
--name User # 表名称
--attributes # 属性。字段名:字段类型
firstName:string,
lastName:string,
email:string

4、生成数据库表

npx sequelize-cli db:migrate --env=<config.json的环境key>

5、js

// 导入express
const express = require('express');
// express实例
var app = express();

const models = require('../models');

// 插入一条数据
app.get('/create',async (res,req)=>{
    let {name} = req.query;
    // 返回promise user-->sequelize对象
    let user = await models.User.create({
        name
    })
    console.log(user);
    res.json({
        message:'创建成功',
        user
    })
})

// 获取列表
app.get('/list',async (res,req)=>{
    let list = await models.User.findAll();
    res.json({
        list
    })
})

// 查询一条数据
app.get('/detail/:id',async (res,req)=>{
    let {id} = req.params;
    let user = await models.User.findOne({
            where:{
                id
            }
        });
    res.json({
        user
    })
})

app.listen(3000,()=>{
  console.log('服务已经启动。。。');
});

本文内容学习自 慕课网 -- Nodejs全栈入门

课程地址

posted @ 2020-06-23 15:11  Lucky丶zhu  阅读(1862)  评论(0编辑  收藏  举报