乐趣区

关于node.js:让nodejs开启服务更简单express篇

上一篇文章说到,nodejs 获取客户端申请须要咱们本人去解决申请参数、申请形式等,而在 express 框架外部集成了很多好用的办法,咱们不须要从 0 开始编写各种解决逻辑,这样能够极大进步咱们的开发效率~

通过引入 express,再执行 express 函数,生成的 app 对象通过中间件来进行各种操作。

const express = require('express')
const app = express()

app.post('/home', (req, res, next)=>{res.end('hello express')
})

app.listen('8000', ()=>{})

app 属性中有 get/post/put/delete 等等办法来接管不同申请形式的申请数据,这些办法都属于中间件,另外,它还有 use 办法能够接管所有类型的申请,并且 express 中的中间件是能够应用多个的,首先匹配第一个符合条件的中间件来解决申请并响应,如果须要执行多个中间件,可通过中间件回调函数中的第三个参数 next,来执行下一个可匹配的中间件。

const express = require('express')
const app = express()

app.use('/', (req, res, next)=>{console.log('匹配到了 use 中间件')
  next()})

app.post('/home', (req, res, next)=>{console.log('匹配到了 post 中间件')
    res.end('hello express')
})

app.listen('8000', ()=>{console.log('开启 8000 端口')
})

因为中间件的这个个性,就能够依据不同的申请类型来对立解决数据,罕用的申请形式和类型总共有 5 种,get 申请中有两种,别离是 params 和 query 传参。
params 传参的格局相似于 localhost:8000/goods/1,这个数字 1 就是动静传入的,query 传参的格局相似于 localhost:8080/login?name=kiki,在问号前面应用键值对的模式拼接参数。

express 的解决形式非常简单,通过回调函数中 req.params 和 req.query 即可获取

app.get('/goods/:id', (req, res, next)=>{console.log(req.url)
  console.log(req.params)
  res.end('params')
})

app.get('/login', (req, res, next)=>{console.log(req.url)
  console.log(req.query)
  res.end('query')
})

post 申请中还有另外三种常见的申请类型,别离是 json、urlencoded 和 form-data。
json 字符串示意传递的数据是键值对的模式,格局如 {“name”: “kiki”, password: 666},urlencode 格局如 name=kiki&password=666,而 form-data 就是表单提交的模式,通常用于文件上传。

// 获取 json 格局的申请参数
app.use(express.json());
//  获取 urlencoded 格局的申请参数
app.use(express.urlencoded({extended: true}));
// 在下一个匹配的 post 申请里通过 req.body 来获取, 有兼容性问题, 须要 express4.16 以上

app.post('/login', (req, res, next) => {console.log(req.body);
  res.end("login success");
});

表单提交的解决形式会略微简单一点,须要装置第三方库 multer 来解决

const express = require('express')
const multer = require('multer')
const app = express()
const upload = multer()

// 传递非文件类型时, 应用 upload.any(), 传递文件类型时 upload.array("file")
app.use('/login', upload.array("file"), (req, res, next)=>{console.log(req.files)
   console.log(req.body)
   res.end('form-data') 
}) 

app.listen(8000, () => {console.log('开启 8000 端口')
});

上图以 form-data 的模式发送了一个 post 申请,申请里包含了非文件和文件类型,req.body 能够获取非文件信息,通过 req.files 能够获取文件信息,文件信息的内容以 buffer 二进制数据的模式获取,可自行对上传的文件进行解决。

说完了解析参数,再来看看对客户端的申请做出响应,包含设置响应状态码,响应的参数类型,响应的具体内容

app.get('/login', (req, res, next) => {console.log(req.query);
  // 设置响应码
  res.status(200);
    // 设置响应类型
  res.type("application/json");
  res.end(JSON.stringify({name: "kiki", age: 16}));
  
  // 以上两行能够合并成 res.json({name: "kiki", age: 16});
});

再来看看 express 略微简单一点的用法,当咱们通过 express 提供的接口是 restful 类型的时候,同样一个路由地址,可能对应着多种申请形式,如 get/post/put/delete。
如果每一种申请形式都写一次,代码变得难浏览和保护,咱们此时能够思考按接口抽取成独自的路由文件,比方对立匹配 /user 接口,get 申请 /user 时获取所有的 user 信息,get 申请 /user/id 时获取某个 id 的 user 信息,post 申请 /user 时新增用户信息,put 申请 /user 时批改用户信息,delete 申请 /user 时删除用户。
通过 express 的 Router 办法创立 router 对象,定义所有须要的申请办法,最初导出 router 对象。

const express = require('express')
const router = express.Router()

router.get('/', (req, res, next)=>{
  res.json([{name: 'alice', age: 17},{name: 'lili', age: 16}])
})

router.get('/:id', (req, res, next)=>{res.json({ name: 'alice', age: 17})
})

router.post('/', (req, res, next)=>{res.json('post')
})

router.put('/', (req, res, next)=>{res.json('put')
})

router.delete('/', (req, res, next)=>{res.json('delete')
})

module.exports = router;

以上为定义的 user 文件,能够看到以上的路由是不蕴含 /user 这个通用的路由的,因为它被定义在了主入口处,主入口文件引入以上的 js 文件,将导入的 router 作为中间件传入到 use 办法中,这样就能够用四种不同的形式调用同一个接口。

const express = require('express')
const userRouter = require('./routers/user')
const app = express()

app.use('/user', userRouter)

app.listen(8000, ()=>{})

还有一个比拟重要的就是解决申请中的谬误,在下面的中间件应用过程中,next 办法用于执行下一个匹配的两头,括号里是不须要传参数的,而当须要处理错误的时候,就能够在 next 中传入参数,而后再定义一个公共的处理错误的中间件。

const express = require('express')
const app = express()

const NOT_FIND = 'NOT_FIND'
const TIME_OUT = 'TIME_OUT'

app.get('/login', (req, res, next)=>{next(new Error(NOT_FIND))
})

app.get('/home', (req, ers, next)=>[next(new Error(TIME_OUT))
])

app.use((error, req, res, next)=>{console.log('>>>>>>>>>error', error)
  let code = 400;
  let message = ''
  switch(error.message){
    case NOT_FIND:
      message = '您的信息有误'
      break;
    case TIME_OUT:
      message = '已超时';
      break;
    default:
      break;   
  }
  res.json({
    code,
    message
  })
})

app.listen(8000, ()=>{})

以上就是 express 中对于开启服务的局部,nodejs 中的相干常识能够参考这一篇 nodejs 中如何应用 http 创立一个服务 下一篇聊聊 Koa 开启服务~

退出移动版