Node.js是基于Chrome V8引擎的JS的后端运行环境,前端运行环境是浏览器。Node.js不能调用Web API。
一、初识Node.js
1.1 概述
Node.js运行环境 Node.js应用场景 Node.js学习路线1.2 基础
1.2.1 CommonJS
CommonJS原文链接:https://blog.csdn.net/u012060033/article/details/102753195
Node程序由许多个模块组成,每个模块就是一个文件。Node模块采用了CommonJS规范;根据CommonJS规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在一个文件定义的变量(还包括函数和类),都是私有的,对其他文件是不可见的。
CommonJS模块的特点如下
- 所有代码都运行在模块作用域,不会污染全局作用域。
- 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
- 模块加载的顺序,按照其在代码中出现的顺序。
如果想在多个文件分享变量,必须定义为global对象的属性。CommonJS规定,每个文件的对外接口是module.exports对象。
module:每个模块内部,都有一个module对象,代表当前模块。它有以下属性。
module.id 模块的识别符,通常是带有绝对路径的模块文件名。
module.filename 模块的文件名,带有绝对路径。
module.loaded 返回一个布尔值,表示模块是否已经完成加载。
module.parent 返回一个对象,表示调用该模块的模块。
module.children 返回一个数组,表示该模块要用到的其他模块。
- module.exports属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports变量。
- 为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令。
注意,不能直接将exports变量指向一个值,因为这样等于切断了exports与module.exports的联系。如果你觉得,exports与module.exports之间的区别很难分清,那就放弃使用exports,只使用module.exports。
1.2.2 第三方模块-包
- 1.包来源:https://www.npmjs.com;下载地址:https://registry.npmjs.org;
#查询当前的服务器地址
npm config get registry
#永久切换镜像源 或者使用nrm工具
npm config set registry https://registry.npm.taobao.org
#临时切换镜像源
npm install --registry=https://registry.npm.taobao.org
#检查镜像是否下载成功
npm config get registry
npm工具在安装Node.js的时候已经安装,用来在registry.npmjs.org下载所需包。
版本规范- 2.安装包
npm install xxx
; - 3.
package.json
管理包; - 4.安装所有依赖包:
npm install
或者npm i
;
4.1 内网安装:https://www.jb51.net/article/151349.htm;
4.2 开发阶段的包:npm i xx -D
;全程:npm install xx --save-dev
;
4.3 全局包:npm i xx -g
; - 5.卸载包:
npm uninstall
;
二、Node.js内置API
2.1 fs 模块
参考:https://www.cnblogs.com/starof/p/5038300.html
fs 模块是Node.js官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。
使用require('fs')载入fs模块,模块中所有方法都有同步和异步两种形式。
2.1.1 同步和异步
#####异步写法
var fs = require('fs'); // 载入fs模块
fs.unlink('/tmp/shiyanlou', function(err) {
if (err) {
throw err;
}
console.log('成功删除了 /tmp/shiyanlou');
});
#####同步步写法
fs.unlinkSync('/tmp/shiyanlou'); // Sync 表示是同步方法
console.log('成功删除了 /tmp/shiyanlou');
2.1.2 读取文件
fs.readFile(filename,[option],callback) 方法读取文件。
readFile同步的写法就是没有回调函数:fs.readFileSync(filename,[options])。
// 设置编码格式
fs.readFile('./test.txt', 'utf-8', function(err, data) {
// 读取文件失败/错误
if (err) {
throw err;
}
// 读取文件成功
console.log('utf-8: ', data.toString());
//直接用console.log(data);也可以
});
2.1.3 写入文件
使用fs.writeFile(filename,data,[options],callback)写入内容到文件。
var fs = require('fs'); // 引入fs模块
// 写入文件内容(如果文件不存在会创建一个文件)
// 传递了追加参数 { 'flag': 'a' }
fs.writeFile('./test2.txt', 'test test', { 'flag': 'a' }, function(err) {
if (err) {
throw err;
}
console.log('Saved.');
// 写入成功后读取测试
fs.readFile('./test2.txt', 'utf-8', function(err, data) {
if (err) {
throw err;
}
console.log(data);
});
});
补充
:fs.read和fs.write功能类似fs.readFile和fs.writeFile(),但提供更底层的操作,实际应用中多用fs.readFile和fs.writeFile。使用fs.read和fs.write读写文件需要使用fs.open打开文件和fs.close关闭文件。
2.1.4创建目录
使用fs.mkdir(path,[mode],callback)创建目录
var fs = require('fs'); // 引入fs模块
// 创建 newdir 目录
fs.mkdir('./newdir', function(err) {
if (err) {
throw err;
}
console.log('make dir success.');
});
2.1.5读取目录
使用fs.readdir(path,callback)读取文件目录。
var fs = require('fs'); // 引入fs模块
fs.readdir('./newdir', function(err, files) {
if (err) {
throw err;
}
// files是一个数组
// 每个元素是此目录下的文件或文件夹的名称
console.log(files);
});
2.2 path模块
是Node官方提供的、用来处理路径的模块,它提供了一系列的方法和属性,用来满足用户对路径的处理。
转载:https://www.jianshu.com/p/fe41ee02efc8
2.2.1 路径解析,得到规范化的路径格式
//引用该模块
var path = require("path");
//对window系统,目录分隔为'\', 对于UNIX系统,分隔符为'/',针对'..'返回上一级;/与\\都被统一转换
//path.normalize(p);
var myPath = path.normalize(__dirname + '/test/a//b//../c/utilyou.mp3');
console.log(myPath); //windows: E:\workspace\NodeJS\app\fs\test\a\c\utilyou.mp3
2.2.2 路径结合、合并,路径最后不会带目录分隔符
var path1 = 'path1',
path2 = 'path2//pp\\',
path3 = '../path3';
var myPath = path.join(path1, path2, path3);
console.log(myPath); //path1\path2\path3
2.2.3 获取绝对路径
var myPath = path.resolve('path1', 'path2', 'a/b\\c/');
console.log(myPath);//E:\workspace\NodeJS\path1\path2\a\b\c
2.2.4 获取相对路径
var from = 'c:\\from\\a\\',
to = 'c:/test/b';
var _path = path.relative(from, to);
console.log(_path); //..\..\test\b; 表示从from到to的相对路径
2.2.5 获取目录
var myPath = path.dirname(__dirname + '/test/util you.mp3');
console.log(myPath);
2.2.6 获取文件名称
var myPath = path.basename(__dirname + '/test/util you.mp3', '.mp3');
console.log(myPath);
2.2.7 获取路径中的扩展名
//获取路径中的扩展名,如果没有'.',则返回空
path.extname(path)
2.2.8返回操作系统中文件分隔符
//返回操作系统中文件分隔符; window是'\\', Unix是'/'
path.sep属性
2.2.9 返回操作系统中目录分隔符
//返回操作系统中目录分隔符,如window是';', Unix中是':'
path.delimiter属性
2.3 http模块
是Node.js官方提供的用来创建Web服务器的模块。
http模块主要用于创建http server服务,支持更多特性、不缓冲请求和响应处理流相关。
转载:https://www.cnblogs.com/starof/p/5038890.html
2.3.1 示例
1.server.js:创建http服务,监听请求,让route处理。
//
// 创建http server
//
// 加载所需模块
var http = require('http');
var url = require('url');
var fs = require('fs');
// 设置ip和端口
// 实际应用中,可以把这些写到配置文件中
var host = '127.0.0.1',
port = 8080;
// 创建http server
function start(route, handle) {
// 参数
// route 判断url是否存在,存在则调用handle处理,不存在则返回404
// handle 处理不同的url请求
// 处理request请求
function onRequest(req, res) {
// 使用url.parse()方法解析url
// 它会把url string转化为一个object
// 这样我们就可以很方便的获取url中的host、port、pathname等值了
var pathname = url.parse(req.url).pathname;
console.log('Request for ' + pathname + ' received.');
// 判断并处理不同url请求
// 后面介绍此方法
route(handle, pathname, res, req);
}
// 使用http.createSserver()方法创建http server
// 并传入onRequest()方法
// 然后使用listen()方法监听指定地址
http.createServer(onRequest).listen(port, host);
console.log('Server has started and listening on ' + host + ':' + port);
}
// 导出 start 方法
exports.start = start;
2.router.js:route判断url是否存在,存在则调用handle处理,不存在则返回404。
var fs = require('fs');
// 路由函数
// 处理不同url的请求
// 并返回相应内容
function route(handle, pathname, res, req) {
console.log('About to route a request for ' + pathname);
// 判断此url是否存在特定处理函数
// 存在则调用handle处理
// 不存在则返回404页面
if (typeof handle[pathname] === 'function') {
// 后面介绍handle函数
handle[pathname](res, req);
} else {
console.log('No request handler found for ' + pathname);
// 读取404页面
// 所有页面都存放在view文件夹下
var content = fs.readFileSync('./views/404.html');
res.writeHead(404, { 'Content-Type': 'text/html' });
res.write(content);
res.end();
}
}
// 导出 route 方法
exports.route = route;
3.requestHandlers.js:handle处理不同的url请求。
// 处理url请求
var fs = require('fs');
// home.html 主页
function home(res) {
console.log('Request handler "home" was called.');
// 读取home.html文件
var content = fs.readFileSync('./views/home.html');
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write(content);
res.end();
}
// about.html 关于页面
function about(res) {
console.log('Request handler "about" was called.');
// 读取about.html文件
var content = fs.readFileSync('./views/about.html');
res.write(200, { 'Content-Type': 'text/html' });
res.write(content);
res.end();
}
// 导出页面处理函数
exports.home = home;
exports.about = about;
4.主程序main.js
// 主程序
// 引入server,router及requestHandler
var server = require('./server');
var router = require('./router');
var requestHandlers = require('./requestHandlers');
// 保存url处理方法
var handle = {};
handle['/'] = requestHandlers.home;
handle['/about'] = requestHandlers.about;
// 启动http server
server.start(router.route, handle);
三、Node.js第三方API
第三方模块加载机制3.1 Express
基于Node.js平台,快速、开放、极简的 Web 开发框架。作用与http模块类似。
详见:https://www.expressjs.com.cn/starter/installing.html
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
中间件分类
自定义中间库
模块化路由
网友评论