- 中间件
- mothod
- nodemon
- ~的使用
中间件
中间件我觉得就是个开箱即用的工具,写好中间件函数,直接use就好。
示例1:
let myLogger = (req, res, next) => {
console.log('hi');
}
app.use(myLogger);
示例2:
// 匿名函数
app.use((req, res, next) => {
console.log('hi');
});
另外,中间件的参数有err(错误),req(请求),res(响应),next(下一个中间件),执行完当前中间件需要调用next();不然后面的get、post、use都不会执行。
示例1:
// 匿名函数
app.use((req, res, next) => {
console.log('hi');
next(); // 注释掉这一句就不会走下面的get
});
app.get('/', (req, res) => {
console.log('im get');
});
中间件的顺序也是有规定的,如果中间件调用的位置错误,很有可能报错。
示例1:
// 立马抛出404
app.use((req, res, next) => {
throw Error('404 not found');
});
// 下面将不会调用
app.get('/', (req, res) => {
console.log('im get');
});
所以要按逻辑顺序排列,如:请求/api/user?api-key=foo
,如果要在/api
的时候做处理,那就app.use('/api',()=>{doSomething();next()})
,然后再请求app.get()
,最后放抛出异常的use。
示例1:
app.use('/api', (req, res, next) => {
// 遇到错误立马调用下一个中间件并返回
if (!key) return next(error(400, 'api-key required'));
next();
});
app.get('/api/users', (req, res, next) => {
res.send(users);
});
app.use((err, req, res, next) => {
res.status(err.status || 500);
res.send({error: err.message});
});
app.use((req, res) => {
res.status(404);
res.send({error: '404 not found'});
});
method
method其实是个很小的东西了,对应get、post、put、delete等。
在express调用的模式就是app.method()
示例1:
app.get('/', (req, res) => {
console.log('im get');
});
modemon
nodemon是一个小工具,类似webpack -w的东西,可以用npm全局安装。
省去了修改node主文件后需要重启node的麻烦。
具体用法:nodemon index.js
~的使用
这次还有一个收获就是~
。这是个神奇的符号,叫按位非。
示例1:
if (!~apiKeys.indexOf(key)) return next(error(401, 'invalid api key'));
- 如果在apiKeys里找不到key,那么indexOf的返回值就是-1,~以后就是0,!类型转换为true。
- 找的到key,返回值就是下标,~以后就是非零数,!类型转换为false。
结论:!~
的组合拳意思为不存在的时候执行。