app.use(prefix) 能对所有以路径参数开头的路由进行匹配,无论post请求还是get请求。
get请求和post请求都能访问 app.use():
简单写一个服务程序
const express = require('express')
const app = express()
app.use("/test", ( req, res)=>{
res.send("测试成功!")
})
app.listen('8081','127.0.0.1',()=>{
console.log("http://localhost:8081")
})
分别使用get方式和post方式请求
get请求 http://localhost:8081/test
post请求:
const http = require('http')
const queryString = require("querystring")
function $post(path,data){
let options = {
hostname: "localhost",
port: 8081,
path: path,
method: "post"
}
let req = http.request( options, function(res) {
res.setEncoding("utf8")
let data = ""
res.on("data", (chunk) => {
data += chunk
});
res.on("end", () => {
console.log(data)
})
res.on("error", (err) => {
console.log(err)
})
})
req.write( queryString.stringify(data) )
req.end()
}
$post("/test",{})
两个请求都能响应成功,说明没有问题。
app.use()只提供路径的匹配,没有post数据的接收和解析
服务程序中添加
app.use("/test2", ( req, res)=>{
if(req.method == "GET"){
console.log( req.query)
}
if(req.method == "POST"){
console.log( req.body)
}
res.send("测试成功!")
})
这次先测试post:
参数改为: $post("/test2/randStr",{})
$post("/test2/randStr",{a1: "123"})
能够正常响应,说明两个路由请求都能访问到服务器,app.use()支持所有以路径参数开头的post请求方法!
但是,服务器没有打印请求参数。为什么会这样,因为没有接收数据。这一点app.use()和app.post()一样,express提供的这两种方法都只是路径的匹配,没有数据的接收和解析。
添加一下数据接收的方法:
app.use("*", ( req, res,next)=>{
let data = ""
req.on("data",(chunk) => {
data += chunk
})
req.on("end", () => {
if(req.method == "POST"){
req.body = data
}
next()
})
})
重新发送一下刚才的post请求,打印结果分别为 空 和 a1=123 。正常情况下应该将数据解析为一个对象放到 req.body 中,这里就不进行演示了。
然后测试一下 get 请求:http://localhost:8081/test2/randStr
http://localhost:8081/test2/randStr?str=asd
能够正常响应,服务端的打印结果为 {} 和 { str: 'asd' } 。说明app.use()支持所有以路径参数开头的get请求方法!而且能够获取参数。
至于为什么 post 请求要进行专门的数据接收和转化。如果在刚才的路由中 打印一下 url ,会发现刚才两个get 请求的 req.url 分别为 /randStr 和 /randStr?str=asd ,请求头已经将数据带过来了。这涉及get 请求和 post 请求的基本区别,就不进行赘述了。
总之
app.use(prefix) 能对所有以路径参数开头的路由进行匹配。这也是用它来进行组件注册的原因之一。将固定的路由的全部请求交给某一特定的组件,完成某些公用的功能。
例如:访问控制、日志打印,404处理等,这些属于组件的用途, 也可以进行路由的分发。
正常的代码会将数据接收和解析交给专门的组件来做。