今天看node项目, 发现了里面使用了一些方法,不是很了解,查了下,在此记录一下:
1. 模版引擎
var app = express();
app.set('views', './views'); // 指定模板文件存放位置
app.set('view engine', 'hb') // 设置默认的模板引擎
注册指定扩展名的模板引擎 :
var app = express();
app.engine('jade', require('jade')._express);
2. 本地变量
express()的app对象提供了app.locals属性来存储本地变量, app.locals实际上是一个函数对象,这意味着可以有两种方式来设置变量。
app.locals.title = "Hello Express";
app.locals.version = 4.0;
app.locals({
title: "Hello Express",
version: 4.0
});
3. 路由:
router 一般我们常用的方式也就是get和post,两者在写法上没有什么区别,但是在action中如果取值的话,会有一些区别,因为get方式的请求我们知道是直接拼接在url后面的, 而post方式是放到请求体中的,所以获取的时候方法不同;
app.get('/index', function(req, res) {
res.render('index.hb');
});
app.post('/index', function(req, res) {
res.render('index.hb');
});
4. 连接路径
path.join([path1][,path2][,…]), 可以连接任意多个路径字符串。要连接的多个路径可做为参数传入;**
const path = require('path');
path.join('path1','path2');
//返回 path1/path2
path.join(__dirname, 'index.js')
//返回 /users/workspace/test/index.js ,__dirname 表示当前运行环境绝对路径
//path.join()方法用于拼接路径,并返回该路径,结合__dirname可以达到path.resolve()方法同样的效果
5. 检测文件路径
fs.existsSync(path); 同步版的 fs.exists(),exists是已经废弃的,但是existsSync不是!由于该方法属于fs模块,使用前需要引入fs模块(var fs= require(“fs”) );
参数: path 是欲检测的文件路径。**
fs.existsSync = function(path) {
try {
nullCheck(path);
binding.stat(pathModule._makeLong(path));
return true;
} catch (e) {
return false;
}
};
6. module.exports和exports
exports , 通过在特殊的 exports 对象上指定额外的属性,函数和对象可以被添加到模块的根部。模块内的本地变量是私有的,因为模块被 Node.js 包装在一个函数中(详见模块包装器)。
console.log(module);
Module{
id: 'XXX',
exports: {},
parent:
Module {
id: 'XXX',
exports: {},
parent:
Module {
id: '.',
exports: {},
parent: null,
filename: '/bin/www',
loaded: false,
children: [Array],
paths: [Array]
},
filename: 'xxx',
loaded: false,
children: [ [Object], [Object], [Object], [Object], [Object], [Circular] ],
paths: []
},
filename: 'xxxx',
loaded: false,
children: [],
}
console.log(exports);
{}
module.exports = exports = {};
- 当每个js文件在执行或被require的时候,NodeJS其实创建了一个新的实例var module = new Module(),这个实例名叫module。这也就是为什么你并没有定义module这个变量,却能console.log出来而不会报错的原因。
我们通常会这样用,用module.exports去抛出一些方法:
module.exports = {
print : function(){console.log(12345)}
}
我们也会这样用,只用exports:
exports.name = function(){
console.log('exports 方法');
}
exports.area = (r) => PI * r ** 2;
exports.circumference = (r) => 2 * PI * r;
改变exports的指向后所添加的exports.xxx都是无效的。因为require返回的只会是module.exports
7. fs.statSync(path);
同步的stat(); 方法返回一个stat数组对象;
var fs = require('fs');
var index = fs.statSync(path.join(filePath, fileName));
console.log(index); // 返回的是数组对象,然后可以继续进行需要的判断
源码:
fs.statSync = function(path) {
nullCheck(path);
return binding.stat(pathModule._makeLong(path));
};
stats类中的方法:
方法 | 描述 |
---|---|
stats.isFile() | 如果是文件返回 true,否则返回 false。 |
stats.isDirectory() | 如果是目录返回 true,否则返回 false。 |
stats.isBlockDevice() | 如果是块设备返回 true,否则返回 false。 |
stats.isCharacterDevice() | 如果是字符设备返回 true,否则返回 false。 |
stats.isSymbolicLink() | 如果是软链接返回 true,否则返回 false。 |
stats.isFIFO() | 如果是FIFO,返回true,否则返回 false。FIFO是UNIX中的一种特殊类型的命令管道。 |
stats.isSocket() | 如果是 Socket 返回 true,否则返回 false。 |
8. Handlebars的helper
Handlebars.registerHelper();
Handlebars.registerHelper('formatnumber', function(num, options){
num = num + '';
return num.replace(/(?=(?!^)(?:\d{3})+(?:\.|$))(\d{3}(\.\d+$)?)/g,',$1');
});
// 后续待补充:
app.use();
app.enable();
中间件:
中间件可以总结以下几点:
1、封装了一些处理一个完整事件的功能函数。
2、非内置的中间件需要通过安装后,require到文件就可以运行。
3、封装了一些或许复杂但肯定是通用的功能。