Node 核心模块
Node 为 JavaScript 提供了很多服务器级别的 API。
例如文件操作fs
模块,http 服务构建的http
模块,path
路径模块,os
操作系统信息模块。
使用方法
var fs = require('fs');
var http = require('http');
在 node 中,没有全局作用域,只有模块作用域(文件作用域)
path 路径操作模块
路径模块操作的基本方法
path.basename(path,ext)
- 获取一个路径的文件名(默认包含扩展名)
path.dirname(path)
- 获取一个路径中目录部分
path.extname(path)
- 获取一个路径中的扩展名部分
path.parse(path)
-
把一个路径转为对象
- root 根路径
- dir 目录
- base 包含扩展名的文件名
- ext 扩展名
- name 不包含扩展名的文件名
path.join([...paths])
- 路径拼接方法
path.isAbsolute(path)
- 判断一个路径是否是绝对路径
Node 中的其它成员
在每个模块中,除了 require
,exports
等模块相关 API 之外,还有两个特殊成员
__dirname
可以用来动态获取当前文件模块所属目录的绝对路径
__filename
可以用来动态获取当前文件绝对路径
在文件操作中,使用相对路径是不可靠的,因为在 Node 相对路径的设计就是相对于执行 node 命令所处的路径,所以,文件操作尽量动态的获取绝对路径
使用__dirname
或者__filename
来使相对路径变成绝对路径
模块路径标识不受影响
端口号与 IP 地址
IP 地址用来定位计算机
端口号用来定位具体应用程序(所有需要联网的通信的软件都必须有端口号)
端口号的范围从 0~65560,http 服务默认端口号是 80
可以同时开启多个服务,但同一 IP 地址下多个服务要不同的端口号
Content-Type,通过网络发送文件内容
不同的资源对应不同的 Content-Type,具体参照:https://tool.oschina.net/commons
对于文本类型的数据,带上字符编码,防止解析乱码的问题
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
除了使用 Content-Type 外,HTML 页面中也可以使用<meta charset='utf-8'>
服务端渲染
服务端使用模板引擎渲染,原理是字符串替换
- 客户端渲染不利于 SEO 搜索引擎优化
- 服务端渲染是可以被爬虫抓取到的,而客户端异步渲染不行
- 真正的网站是两者结合,即有服务端渲染也有客户端渲染
- 一般商品列表采用服务端渲染,利于 SEO。商品评论则采用客户端渲染,不需要 SEO,用户体验更好,还能减轻服务端压力。
通过服务器让客户端重定向
-
1.状态码设置为 302 临时重定向 statusCode
- 301 永久重定向 浏览器会记住 不会在次请求
- 302 临时重定向 浏览器不会记
-
2.在响应头中通过 Location 告诉客户端往哪重定向 setHeader
res.statusCode = 302; res.setHeader('Location', '/'); res.end();
CommonJS 模块规范
- 模块系统 Node 中是模块作用域
- 使用 require 方法来加载模块
- 使用 exports 接口对象来导出模块中成员
- 直接导出成员使用 module.exports = add;
加载 require
语法:
var 变量 = require('模块');
两个作用:
- 执行加载模块的代码
- 得到被加载模拟中
exports
导出对象
导出 exports
需要导出的成员都挂载到exports
接口对象中就可以了
导出多个成员(必须是对象中):
exports.add = function () {};
exports.str = 'hello';
exports.obj = { foo: 'bar' };
导出单个成员(拿到的就是函数、字符串):
module.exports = function () {};
Module.exports 也可以导出多个成员:
module.exports = {
add: function () {},
str: 'hello',
};
原理解析
exports
是 module.exports
的一个引用
// var exports = module.exports;
exports.foo = 'bar';
//等价于
module.exports.foo = 'bar';
require 方法加载规则
-
核心模块
- 模块名 核心模块也是文件,已经被编译到二进制文件中
-
第三方模块
- 模块名 必须通过 npm 下载,通过
require('包名')
来加载
- 模块名 必须通过 npm 下载,通过
-
自定义模块
- 路径 通过相对路径来加载
./
或是../
- 路径 通过相对路径来加载
-
规则
- 优先从缓存加载
- 判断模块标识
修改完代码自动重启服务器
第三方命名航工具:nodemon
安装 npm install -g nodemon
启用nodemon app.js
在 Express 获取表单 POST 请求体数据
Express 中没有内置 POST 获取表单请求体的 API, 需要安装第三方包:body-parser
安装:
npm install --save body-parser
配置:
//只要配置了body-parser, 则在req 请求对象上会多出来一个属性 body
// 可以通过 req.body 来获取表单 POST 请求体的数据
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }));
// parse application/json
app.use(bodyParser.json());
使用:
app.use(function (req, res) {
res.setHeader('Content-Type', 'text/plain');
res.write('you posted:\n');
res.end(JSON.stringify(req.body, null, 2));
});