Node.js超光速学习笔记一:3个核心模块、npm、文件操作

超光速学习node.js的笔记

一、使用http模块创建一个简单服务器

1、导入http模块

var http = require('http');

2、创建服务器

http.createServer((req, res) => { }

设置http头部,告诉浏览器状态码200(ok),文件类型html,字符集utf-8

res.writeHead(200, { 'Countent-Type': "text/html:charset='utf-8'" })

写你想在浏览器显示的内容

res.write('你好 node.js');

关闭浏览器加载小圈圈,并显示你想在服务完成时显示的内容

res.end('结束');

3、设置端口号和网址

如果不设置网址,那网址就是localhost

.listen(8899, '192.168.31.6')

完整代码:

var http = require('http');

http.createServer((req, res) => {
	res.writeHead(200, { 'Countent-Type': "text/html:charset='utf-8'" });
	res.write('你好 node.js');
	res.end('结束');
}).listen(8899, '192.168.31.6');

4、运行Node.js服务器

在js的目录下,打开命令窗口,输入:node 文件名

5、安装自启动工具自启动工具supervisor

每次修改node的代码,都需要手动重启服务器

安装supervisor,改代码会自动重启服务器:

(1)安装:npm install - g supervisor

(2)使用 supervisor 代替 node 命令启动:supervisor 文件名

二、使用url模块解析url

1、导入url模块

var url = require('url');

2、使用parse方法解析url地址

true是可选参数,把解析出来的参数query转化为对象

var result = url.parse(req.url);
console.log(result);

如果url是:http://localhost:8080/new?aid=3&cid=4

结果为:

Url {
  protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: null,
  search: '?aid=3&cid=4',
  query: [Object: null prototype] { aid: '3', cid: '4' },
  pathname: '/new',
  path: '/new?aid=3&cid=4',
  href: '/new?aid=3&cid=4' }

3、获取get请求的url传参

get请求是通过url传参,如上所示,url传递了aid和cid两个参数,在query中

var result = url.parse(req.url, true);
console.log(result.query);

true是可选参数,把query中接收到的参数转为对象形式

完整代码:

var url = require('url');
var http = require('http');

http.createServer(function(req, res) {
	res.writeHead(200, { 'Countent-Type': "text/html:charset='utf-8'" });
	//避免拿到favicon.ico这种无效url
	if (req.url != '/favicon.ico') {
		//获取浏览器url输入的信息
		console.log(req.url);
		
		var result = url.parse(req.url, true);
		console.log(result);
		console.log(result.query.aid);
		console.log(result.query.cid);
	}
	res.write('你好 node.js!');
	res.end('结束');
}).listen(8080);

4、获取post请求的传参

post请求的传参在body中

console.log(req.body);

三、自定义模块

1、在外部创建一个js文件

2、自定义内容

var str = '这是自定义模块'

3、向外暴露

exports.str = str		// 法一
module.exports = str	// 法二

4、导入自定义模块

var config = require('./config.js')

5、使用自定义模块

console.log(config)	// 输出 这是自定义模块

四、导入模块流程

为什么导入模块的路径可以简写?

导入模块流程:

先在默认根目录下找,然后在node_modules文件夹下找,找不到就找同名的文件夹,然后根据里面的package.json找到文件,npm安装的模块和引入的核心模块都是这样。

想让自定义模块也能简写路径导入:

把模块文件夹放到node_modules文件夹中,在模块文件夹中,输入:npm init --yes 创建package.json

package.json中的main属性是配置入口文件,一般不用改,创建了package.json就行了

五、NPM命令

常用第二个,其它可以不用管

1,查看版本:npm -v
2,安装模块:npm install 模块名,install可用i简写
3,卸载模块:npm uninstall 模块名
4,查看已安装模块:npm list
5,查看模块版本:npm info 模块名
6,安装指定版本:npm install 模块名@版本号

六、Package

package.json记录了这个项目所需的模块和配置信息

1、创建package.json

npm init
npm init -yes,yes可用y简写

**区别:**第一个就会创建时问你各种配置问题,第二个相当于一路yes回车键,秒创建完

2、安装模块

(1)全局安装
npm install 模块名 -global,global可以g简写

(2)局部安装(只安装在项目中)
npm install 模块名 --save-dev,可用-d简写,安装时模块写入到package.json中的devDependencies对象
npm install 模块名 --save,可以-s简写,安装时模块写入到package.json中的dependencies对象

devDependencies里面的模块只在开发环境使用,不在生产环境使用
dependencies里面的模块无论如何都使用

比如babel转换js语法,只在开发时用到,使用-d安装就行

如果所有模块都安装到dependencies,那么开发完打包正式使用时,安装包非常庞大且有很多无用部分

3、项目依赖

有了package.json后,所需模块都记录下来,即使node_modules被删除,也能使用 npm i 安装所有模块依赖

七、使用fs模块来读写文件

因为fs的函数是对文件的I/O操作,所以都是异步函数,需要回调函数

引入fs模块:

const fs = require ('fs')

1、检测是文件还是目录(文件夹)

fs.stat('文件名', (err, starts) => {
  if(err){
    console.log(err)
    return false
  }
  console.log('文件:'+starts.isFile())		//返回布尔值
  console.log('目录:'+starts.isDirectory())
})

2、创建目录

fs.mkdir('目录名', err => {
  if(err){
    console.log(err)
    return false
  }
  console.log('创建目录成功')
})

3、创建写入文件

如果没有该文件,会先创建。如果存在,则覆盖内容

fs.writeFile('文件名','写入内容', err => {
  if(err){
    console.log(err)
    return false
  }
  console.log('写入成功')
})

4、追加文件

如果没有该文件,会先创建,再写入,写入是追加形式,不会覆盖

fs.appendFile('文件名','写入内容\n', err => {
  if(err){
    console.log(err)
    return false
  }
  console.log('写入成功')
})

5、读取文件

fs.readFile('文件名', (err, data) => {
  if(err){
    console.log(err)
    return false
  }
  console.log(data.toString())	//需要转换为字符串类型
})

6、读取目录

拿到一个目录下的所有目录和文件

fs.readdir('文件名', (err, data) => {
  if(err){
    console.log(err)
    return false
  }
  console.log(data)	//以数组形式输出所含的目录和文件
})

7、重命名

通过参数二,可以改名,也可以修改路径,来剪切文件,

fs.rename('03fs模块/t1.txt','03fs模块/html/t2.txt', err => {
  if(err){
    console.log(err)
    return false
  }
  console.log('改名剪切成功')
})

8、删除目录

fs.rmdir('目录名', err => {
  if(err){
    console.log(err)
    return false
  }
  console.log('删除目录成功')
})

9、删除文件

fs.unlink('文件名', err => {
  if(err){
    console.log(err)
    return false
  }
  console.log('删除文件成功')
})

10、从文件流中读取数据

文件流的意思是一大块的操作数据,而不是一条一条的,数据量大的时候,能明显提高效率

//创建一个读取流
var readStream = fs.createReadStream('要被读取的文件名')

var str = ''  //记录每次读取的数据
var count = 0 //记录读取次数
//每次读取都会广播事件
//监听读取事件
readStream.on('data', chunk => {
  str +=chunk
  count ++
})
//监听完成事件
readStream.on('end', () => {
  console.log(str)
  console.log(count)
})
//监听出错事件
readStream.on('err', err => {
  console.log(err)
})

11、向文件流中写入数据

//创建一个写入流
var writerStream = fs.createWriteStream('要被写入的文件名')

var data = '文件流数据的内容11\n' //要写入内容
//循环5000次写入
for(var i = 0; i < 5000; i++){
  writerStream.write(data, 'utf8')
}
//监听写入完成事件
writerStream.on('finish', () => {
  console.log('写入完成')
})
//监听写入出错事件
writerStream.on('err', () => {
  console.log(err)
})

12、管道流

以文件流的形式,从一个文件读取的数据,写入到另一个文件

//分别创建一个可读流和可写流
var readStream = fs.createReadStream('input.txt')
var writerStream = fs.createWriteStream('output.txt')
//管道读写操作,读取input.txt内容,写入到output.txt中
readStream.pipe(writerStream)
console.log('完成')

例子

(1): 判断服务器中有没有upload目录,没有就创建(图片上传)

fs.stat('upload', (err, stats) => {
  if(err){  //如果出错意味着没有这个目录
    fs.mkdir('upload', error => { //创建目录,参数名不要和上面相同
      if(error) console.log(error)
      console.log('创建成功')
    })
  }else{
    console.log('目录已经存在')
  }
})

(2): 找出html目录下的所有目录

let fileArr = []; //记录html目录下的所有目录
fs.readdir('html', (err, files) => {
	if (err) {
		console.log(err);
	} else {
    console.log(files); //输出数组,要加分号,要不然下面自执行函数报错
    //不能用for循环,因为是异步函数,用自执行函数和递归
		(function getFile(i) {
			//循环结束
			if (i == files.length) console.log(fileArr);
      
			fs.stat('html/' + files[i], (err, stats) => {
				//如果是目录,就插进数组
				if (stats.isDirectory()) {  //判断是不是目录
					fileArr.push(files[i]);
				}
				//递归调用
				getFile(i + 1);
			});
		})(0);
	}
});
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值