nodejs

Author:Helene

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自Helene的博客


使用nodejs启动一个服务

const http = require('http');

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

server.listen('8000','127.0.0.1',()=>{
    console.log('启动成功');
})

//执行node + 文件名即可访问

配置node执行命令

在package.json中src配置:

"scripts": {
    "start": "node src/index.js"
  },
  
以上即可使用npm start启动服务

nodemon

node自动重启工具

cnpm install --save-dev nodemon

修改启动 命令

"scripts": {
    "start": "nodeMon src/index.js"
  },
  
但是上面之后修改任何文件都可以重启,浪费资源

可以通过配置文件解决

新建nodemon.json文件

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

使其只监听src下面的文件夹下的js文件

使用express

const express = require('express')
//一个express的实例
const app = express()

app.get('/user/:age', (req, res) => {
    res.json({
        name: 'zhangsan'
    })
})

app.post('/list/imgList', (req, res) => {
    res.json({
        name: 'imgList',
        list: [
            {
                name: '图1'
            },
            {
                name: '图2'
            }
        ]
    })
})

app.listen(3000,()=>{
    console.log('启动成功')
})

//以上执行之后就可以在浏览器访问到所返回的json数据

app.all

app.all可以忽略用户请求方式

无论任何url,都可以响应=》日志

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

app.use中间件

也可以使用app.use实现上面app.all的忽略方法和响应任何url,但是不推荐这样使用它

app

app=>application=》web服务的实例

如何做路由的拆分

express.Router

member/shopList/userList

member.router.js

const express = require('express')

const router = express.Router()

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

module.exports = router


const memberRouter = require('./member.router')

app.use(memberRouter) //使用app.use中间件将路由注册进来

//app.use()可以写两个参数,第一个参数是路由拼接的前缀路径,如:

app.use('/member',memverRouter)//  /member/list

nodejs中间件

中间件组成:

1、是一个函数
2、参数,err=》对象,req=》对象,res=》对象,next=》函数

自己实现中间件:

function demo_middlewarwe(err,req,res,next){
    //1.异常处理
    //2.处理业务功能,转交控制权=》next
    //3.响应请求=>结束响应=》当做路由的处理函数
}

中间件级别:
1、app级别的使用

注册时候,一定是在最顶级
app.use=>api去加载进来

function log_middleware(req, res, next) {
    console.log('请求来了')
    next()
}

app.use(log_middleware())

以及上面路由拆分的例子也是app级别中间件

2、路由级别

写法一:
router.use(function (req,res,next) {
    console.log('路由级别')
    next()
})
写法二:
router.get('/list', [valid_name_middleware],(req, res) => {
    res.json({
        list: [
            {
                id: '001',
                name: 'helene'
            }
        ]
    })
})
//写法二,第二个参数传递的就是中间件,参数是一个数组,可以使用多个中间件,链式调用
在中间件进行处理的时候还可以给req额外传递参数:
req.formata = {
name:'',
password:''
}

3、异常处理=》app级别=》router级别
// 以下就是一个中间件:
//text?name=123
function valid_name_middleware(req, res, next) {
    let {name} = req.query
    if (!name || !name.length) {
        res.json({
            message: '缺少name参数'
        })
    } else {
        next()
    }
}

// (1)
router.all('*', valid_name_middleware)

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

异常处理

1、异常捕获

express框架已经能够把所有异常都捕获到

2、express内置异常处理

3、自定义异常处理

使用app.use()自定义中间件进行异常处理

app.use(function (err, req, res, next) {
if(err){
    console.error(err.stack)
    res.status(500).send('Something broke!')
}else{
    next()
}
})

异常处理通常是批量的,不能哪个路由模块都设置一次

如何处理404错误

function not_found_handle(req, res, next) {
    //404不是异常,所有err对象时空的
    res.json({
        message: 'api不存在'
    })
}

app.use(not_found_handle)

404错误处理中间件也要写要其他路由最后面

//异常处理要在其他所有路由最后

安装mysql

安装sequelize和sequelize cli

初始化 npx sequelize-cli init