这篇文章讲了path路径以及如何使用绝对路径,还有关于express中间件的一些基础知识。

1. path路径操作模块

  • path.basename
    • 获取一个路径中的文件名(默认包含扩展名)
  • path.dirname
    • 获取一个路径中的目录部分
  • path.extname
    • 获取一个路径中的扩展部分
  • path.parse
    • 把一个路径转为对象
      • root根路径
      • dir目录
      • base包含后缀名的文件名
      • ext后缀名
      • name不包含后缀名的文件名
  • path.join
    • 当需要使用路径拼接的时候推荐这个方法
  • path.isAbsolute
    • 判断一个路径是否为绝对路径

2. Node中的其他成员

在每一个模块中除了requireexports等模块相关API之外还有两个特殊成员:

  • __dirname 用来动态获取当前文件模块所属目录的绝对路径
  • __filename 用来动态获取当前文件的绝对路径
  • __dirname__filename是不受执行node命令所属路径影响的

在文件操作中,使用相对路径是不可靠的,因为在node中的文件操作路径被设计为相对于执行node命令所处的路径。
可以使用绝对路径__dirname 或者__filename来解决这个相对路径问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 举个栗子
// 这里的 './a.txt' 不是相对于当前文件的路径,而是相对于执行node命令所处的终端路径
// 比如这个文件在命令行执行 D:\nodejs\d06\code>node 01-demo.js
// 那么查询文件的路径就是 D:\nodejs\d06\code\a.txt,因为是在code中执行的node命令
let fs = require('fs');
fs.readFile('./a.txt', function(err, data){
if(err){
throw err
}
console.log(data)
})

// 为了避免手动拼接路径导致的低级错误,推荐使用 path.join() 来辅助拼接,于是上面的读取文件又可写成:
fs.readFile(path.join(__dirname, './a.txt'), function(err, data){})

// 注意:
// require('./b.js') 模块中的相对路径不受node命令在哪执行的影响,不用使用 join.path().

所以为了避免相对路径带来的麻烦,node中的使用的相对路径都统一换成动态的绝对路径,于是常见fspath模块是成对出现的。

3. Express中间件

express使用中间件

20181220-101033

中间件本质是上就是一个请求处理方法,我们把用户从请求到响应的整个过程分发到多个中间件中去处理,这样可以提高代码的灵活性,而且动态可扩展。

3.1 应用程序级别的中间件

  • 万能匹配不关心请求路径和请求方法
1
2
3
4
app.use(function (req, res, next){
console.log('time', Date,now());
next();
});
  • 匹配只要以/xxx/开头的
    1
    2
    3
    4
    app.use('/xxx', function (req, res, next){
    console.log('time', Date,now());
    next();
    });

3.2 路由级别的中间件

get:

1
2
3
app.get('/', function (req, res){
res.send('get a GET request')
});

post:

1
2
3
app.post('/', function (req, res){
res.send('get a POST request')
});

put:

1
2
3
app.put('/user', function (req, res){
res.send('get a PUT request at /user')
});

delete:

1
2
3
app.delete('/user', function (req, res){
res.send('get a GET request at /user')
});

3.3 错误处理中间件

1
2
3
4
5
6
7
8
9
10
11
12
app.use(function (err, req, res, next){
console.error(err.stack)
res.status(500).send('something broke')
});

//比如错误发生时响应500 和错误信息
app.use(function (err, req, res, next){
res.status(500).json({
err_code: 500,
message: err.message
})
});

3.4 内置中间件

Starting with version 4.x, Express no longer depends on Connect. The middleware functions that were previously included with Express are now in separate modules; see the list of middleware functions.

Express has the following built-in middleware functions:

  • express.static serves static assets such as HTML files, images, and so on.
  • express.json parses incoming requests with JSON payloads. NOTE: Available with Express 4.16.0+
  • express.urlencoded parses incoming requests with URL-encoded payloads. NOTE: Available with Express 4.16.0+

3.5 第三方中间件

express 中间件