Nodejs及服务端基本知识

本文介绍了Node.js的核心模块,包括path路径操作、服务端渲染、端口号与IP地址、Content-Type的理解以及CommonJS模块规范。讲解了如何在Express中获取POST请求体数据,并提到了动态获取模块路径的方法。
摘要由CSDN通过智能技术生成

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',
};

原理解析

exportsmodule.exports 的一个引用

// var exports = module.exports;
exports.foo = 'bar';
//等价于
module.exports.foo = 'bar';

require 方法加载规则

  • 核心模块

    • 模块名 核心模块也是文件,已经被编译到二进制文件中
  • 第三方模块

    • 模块名 必须通过 npm 下载,通过 require('包名') 来加载
  • 自定义模块

    • 路径 通过相对路径来加载 ./ 或是../
  • 规则

    • 优先从缓存加载
    • 判断模块标识

修改完代码自动重启服务器

第三方命名航工具: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));
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值