超光速学习node.js的笔记
var http = require('http');
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('结束');
如果不设置网址,那网址就是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');
在js的目录下,打开命令窗口,输入:node 文件名
每次修改node的代码,都需要手动重启服务器
安装supervisor,改代码会自动重启服务器:
(1)安装:npm install - g supervisor
(2)使用 supervisor 代替 node 命令启动:supervisor 文件名
var url = require('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' }
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);
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就行了
常用第二个,其它可以不用管
1,查看版本:npm -v
2,安装模块:npm install 模块名,install可用i简写
3,卸载模块:npm uninstall 模块名
4,查看已安装模块:npm list
5,查看模块版本:npm info 模块名
6,安装指定版本:npm install 模块名@版本号
package.json记录了这个项目所需的模块和配置信息
npm init
npm init -yes,yes可用y简写
**区别:**第一个就会创建时问你各种配置问题,第二个相当于一路yes回车键,秒创建完
(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,那么开发完打包正式使用时,安装包非常庞大且有很多无用部分
有了package.json后,所需模块都记录下来,即使node_modules被删除,也能使用 npm i 安装所有模块依赖
因为fs的函数是对文件的I/O操作,所以都是异步函数,需要回调函数
引入fs模块:
const fs = require ('fs')
fs.stat('文件名', (err, starts) => {
if(err){
console.log(err)
return false
}
console.log('文件:'+starts.isFile()) //返回布尔值
console.log('目录:'+starts.isDirectory())
})
fs.mkdir('目录名', err => {
if(err){
console.log(err)
return false
}
console.log('创建目录成功')
})
如果没有该文件,会先创建。如果存在,则覆盖内容
fs.writeFile('文件名','写入内容', err => {
if(err){
console.log(err)
return false
}
console.log('写入成功')
})
如果没有该文件,会先创建,再写入,写入是追加形式,不会覆盖
fs.appendFile('文件名','写入内容\n', err => {
if(err){
console.log(err)
return false
}
console.log('写入成功')
})
fs.readFile('文件名', (err, data) => {
if(err){
console.log(err)
return false
}
console.log(data.toString()) //需要转换为字符串类型
})
拿到一个目录下的所有目录和文件
fs.readdir('文件名', (err, data) => {
if(err){
console.log(err)
return false
}
console.log(data) //以数组形式输出所含的目录和文件
})
通过参数二,可以改名,也可以修改路径,来剪切文件,
fs.rename('03fs模块/t1.txt','03fs模块/html/t2.txt', err => {
if(err){
console.log(err)
return false
}
console.log('改名剪切成功')
})
fs.rmdir('目录名', err => {
if(err){
console.log(err)
return false
}
console.log('删除目录成功')
})
fs.unlink('文件名', err => {
if(err){
console.log(err)
return false
}
console.log('删除文件成功')
})
文件流的意思是一大块的操作数据,而不是一条一条的,数据量大的时候,能明显提高效率
//创建一个读取流
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)
})
//创建一个写入流
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)
})
以文件流的形式,从一个文件读取的数据,写入到另一个文件
//分别创建一个可读流和可写流
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);
}
});