nodeeeeeeeeeeeeeeeeeeee

62 阅读10分钟

node常用命令

1.node中的模块引入

1.模块的基本导入导出

//one.js
//导出模块方式1
module.exports ={
   a:10,
   b:20,
   c:function(){
       console.log('我是c函数')
   }
}


//index.js
//引入模块: 注意要带./因为是服务器运行了
var one = require('./one');
console.log(one);
console.log(one.a);
console.log(one.b);
one.c();
console.log('----------');

2.四种模块导出写法

//1.综合写法
module.exports ={
   a:10,
   b:20,
   c:function(){
       console.log('我是c函数')
   }
}


//2.单独写法
module.exports.a = 10;
module.exports.b = 20;
module.exports.c = function(){
    console.log('c函数');
}



// 3.拆分写法
var a = 10;
var b = 20;
var c = function(){
    console.log('我是c函数');
}
module.exports={
    a,b,c
}



//4.exports简写
exports.a = 10;
exports.b = 20;
exports.c = function(){
    console.log('c函数')
}


//注意: exports不能直接导出对象, 拿不到对象的值
exportsmodule.exports是指向同一个对象,
//这种写法是错误的    
exports ={
   a:10,
   b:20,
   c:function(){
       console.log('我是c函数')
   }
}

3.module.exports 和exports的关系

//module.exports 和exports对象的对比
console.log(module.exports === exports);  //true 
exports = {
    a :123
}//true 
console.log(module.exports === exports);  //true 


//注意: exports不能直接导出对象, 因为会切断与module.exports对象的关系

参考文档: module.exports与exports,export与export default之间的关系和区别

4.require引入包的顺序

require('./one')
1.内置模块(node的)
2.文件模块(插件当前文件)
3.文件目录模块(没有对应的文件,就找对象的目录)
4.node_modules模块(先本地,后全局)

javascript.ruanyifeng.com/nodejs/modu…

2.http模块

注意: http模块是node自带的模块,不需要下载,直接引用就可以了
http模块是用来创建服务器的. 掌握以下方法即可.
http.createServer(function(req,res){})  //http模块的createServer方法,会返回一个服务器对象
server.listen(端口);    //服务器对象,调用listen方法来监听端口
res.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"}); //响应头
res.write();  //返回数据内容,也必须使用res.end结束,不然一直请求
res.end();   //结束返回(可以包含res.write)----建议使用


req.url     //可以获得用户请求的网址路径
req.method  //获得用户请求的方法
node的http模块主要使用来创建服务器的.
1. 引入http模块
2. 创建服务器(req和res表示请求和响应对象)
3. 监听端口


//注意: 端口一般大于3000就可以,系统用了一部分,只要不冲突就行了
//1.引入模块
const http  = require('http');
//2.创建服务器,接收请求和响应
let server = http.createServer(function(req,res){    
    res.writeHead(200, { "Content-Type": "text/html;charset=UTF-8" })
    // res.end('返回的内容')
    res.write('返回的内容')
    res.end();
})
//3.监听端口
server.listen(3000,function(){
    console.log('服务器已经开启');
});


//注意,修改服务器代码之后,一定要重启服务器,才能生效
//注意: req.url可以拿到用户请求的网址
//注意:res.end() 相当于: res.write()和res.end();
res.write()写入数据,多个会连接成一个.

4.url模块

url模块用来将请求地址,转换为对象,
url.parse(路径,参数是否为对象);  //默认为false字符串,一般设置为true对象


例如:http://127.0.0.1:3000/login?username=zhangsan&password=123456
//true表示返回一个对象,false表示还是一个字符串, 返回一个对象,其中query中放着参数
let urlObj=url.parse(请求路径,true);   //将参数包装成对象,第二个参数为ture,参数变为对象
urlObj.query.username  //获得用户名
urlObj.query.password  //获得密码 



//参考代码
const http = require('http');
const url = require('url')
let server = http.createServer(function(req,res){
    //设置响应格式
    res.writeHead(200, { "Content-Type": "text/html;charset=UTF-8" })
    if(req.url == '/favicon.ico') return;
    //将url请求字符串,转换为对象
    console.log(req.url);
    //将网址转换为对象
    var urlObj = url.parse(req.url,true);
    console.log(urlObj.query.username)
    res.end('返回的数据');
})


server.listen(3000,function(){
    console.log('服务器启动了');
})

注意:每次修改服务器内容代码,就需要重启

5.nodemon热重载工具

nodemon 也是热部署工具
作用: 自动检测程序的变化,不需要你自己每次修改一点就重启服务器.
npm i nodemon -g
nodemon js文件


不需要重启服务器,直接刷新网页就可以了.

6.node处理get请求

get 请求的参数在网址中: http://127.0.0.1:3000/login?username=zhangsan&password=123456


const http = require('http');
const url = require('url');
let server = http.createServer(function(req,res){
    res.writeHead(200, { "Content-Type": "text/html;charset=UTF-8" });
    if(req.url == '/favicon.ico') return;
    console.log(req.url);
    //将请求参数转换为对象
    let params = url.parse(req.url,true);
    //得到参数对象
    console.log(params.query);
    res.end('得到数据了'+req.url);
})


server.listen(3000,function(){
    console.log('服务器启动了');
})

7.node处理post请求

//post请求的数据,在请求体中,需要以文件块的方式进行接收


//获得请求数据,chunk就是一块块数据,然后拼接在一起
req.on('data',function(chunk){

})
//数据获取结束
req.on('end',function(){
    //获取数据结束后,使用res.end的打印
})
使用postman模拟发送post数据并且,写在body中.
const http = require('http');


let server = http.createServer(function(req,res){    
    //判断是否是post请求
    if(req.method === 'POST'){        
        //定义变量存储数据
        let postData = '';
        //接收数据
        req.on('data',function(chunk){
            //将二进制转换为字符串
            postData += chunk;
        })
        //接收数据完毕
        req.on('end',function(){                      
            //直接输出,不识别中文
            console.log(postData);           
            res.end(postData);            
        })
    }
})
server.listen(3000,function(){
    console.log('服务器运行了')
})

注意: 对象转换为字符串的方法: util.inspect() 或者 JSON.stringify()

​ querystring.parse() 将字符串 转换为对象

8.node返回JSON数据

根据请求,返回JSON数据. 写死一个对象,然后转为JSON字符串,返回就行了 
JSON.stringify()
const http = require('http');
let server = http.createServer(function(req,res){    
    res.writeHead(200, { "Content-Type": "text/json;charset=UTF-8" });
    let user = {
        name:'张三',
        age:19
    }
    res.end(JSON.stringify(user));
})
server.listen(3000,function(){
    console.log('服务器运行了')
})

9.fs模块

后缀加Sync的是同步,不加是异步,同步方法的特点是阻塞代码,性能差,异步代码的特点是回调函数嵌套多,在使用fs应尽量使用异步方式编程来保证性能。

fs.stat/fs.statSync  检测是文件还是目录
fs.mkdir/fs.mkdirSync  创建目录
fs.writeFile/fs.writeFileSync  创建写入文件
fs.appendFile/fs.appendFileSync  追加文件
fs.readFile/fs.readFileSync   读取文件
fs.readdir/fs.readdirSync    读取目录
fs.rename/fs.renameSync   重命名
fs.rmdir/fs.rmdirSync    删除目录
fs.unlink/fs.unlinkSync    删除文件
fs.createReadStream/fs.createReadStreamSync  从文件流中读取数据
fs.createWriteStream/fs.createWriteStreamSync 写入文件流数据
管道流概念: 实现大文件传输(小文件一次性传输过去,大文件慢慢传)

1.创建文件夹

const fs = require('fs');
//第一个参数,文件夹路径和名字, 第二个参数是权限默认就可以,不写,第三个参数是错误的回调
fs.mkdir('demo', function(err) {
    if (err) {
        console.log('文件夹创建失败');
        console.log(err);
        //创建文件失败后,就不继续打印创建成功了
        return false;
    }
    console.log('创建文件夹成功');
})
//注意: 如果demo/a 就可以创建两个文件夹 demo下有个a

2.检测文件和目录

const fs = require('fs');
//err错误信息, stats检测对象,然后可以调用
//isFile() 判断是否是文件,返回布尔类型
//isDirectory() 判断是文件夹,返回布尔类型
fs.stat('demo', function(err, stats) {
    if (err) {
        console.log('文件检测错误');
        console.log(err);
        return false;
    }
    console.log('文件:' + stats.isFile());
    console.log('文件夹:' +stats.isDirectory());
})

3.删除目录

const fs = require('fs');
fs.rmdir('demo', function(err) {
    if (err) {
        console.log(err);
        return false;
    }
    console.log('删除目录成功');
})

4.读取目录

//fs.readdir 读取目录:  会将目录下的文件和文件夹都获取到
let fs = require('fs');
//拿到一个文件夹下的所有目录: 包括文件夹和文件
fs.readdir('demo', function(err, data) {
    if (err) {
        console.log(err);
        return false;
    }
    console.log(data);
})

5.创建文件

//创建文件,并写入内容
let fs = require('fs');
//第一个参数: 文件名字,没有这个文件创建,有文件覆盖
//第二个参数: 文件内容
//第三个参数: 文件编码格式
//第四个参数:错误的回调
fs.writeFile('a.txt', '用node创建的文件111', 'utf-8', function(err) {
    if (err) {
        console.log(err);
        return false;
    }
    console.log('写入成功');
})

6.追加文件内容

let fs = require('fs');
//第一个参数: 文件名字,没有这个文件创建,有文件覆盖
//第二个参数: 文件内容
//第三个参数: 文件编码格式
//第四个参数:错误的回调
fs.appendFile('a.txt', '111这是追加的内容', function(err) {
    if (err) {
        console.log(err);
        return false;
    }
    console.log('追加成功');
})

7.读取文件

异步

let fs = require('fs');
//第一个参数: 文件名字,没有这个文件创建,有文件覆盖
//第二个参数:错误的回调
fs.readFile('a.txt', function(err, data) {
    if (err) {
        console.log(err);
        return false;
    }
    //默认读取格式为16进制 Buffer
    console.log(data);
    console.log(data.toString());
})

同步

const fs = require('fs')
const data = fs.readFileSync('E:\工作文件\学习文件\node\demo.text','utf-8')
console.log(data);

8.删除文件

let fs = require('fs');
fs.unlink('a.1.txt', function(err) {
    if (err) {
        console.log(err);
        return false;
    }
    console.log('删除文件成功');
})

9.重命名

let fs = require('fs');
//修改文件的名字
fs.rename('c.html', 'x.html', function(err) {
     if (err) {
        console.log(err);
        return false;
     }
     console.log('修改名字成功');
 })

//也可以修改文件夹名字
// 还可以进行剪切,文件夹必须存在
fs.rename('demo/b/1.txt', './1.txt', function(err) {
    if (err) {
        console.log(err);
        return false;
    }
    console.log('修改名字成功');
})

10.读取流

fs读取大文件占内存,效率低。流是将数据分割段,一段一段的读取,可以控制速率,效率很高,不会占用太大的内存。

1.创建读取流
let readStream = fs.createReadStream('mi.jpg');
2.open -打开文件
rs.on("open",()=>{
   console.log("文件打开")
});
3.data -当有数据可读时触发。
rs.on('data',(data)=>{
    console.log(data); 
});
4.error -在读收和写入过程中发生错误时触发。
rs.on("err",()=>{
    console.log("发生错误")
});
5.close -关闭文件
rs.on("close",()=>{ //最后文件关闭触发
    console.log("关闭")
});
6.end - 没有更多的数据可读时触发
rs.on('end',()=>{ //文件读取完毕后触发
    console.log("读取完毕");
});
//图片读取的很慢,文字读取的很快
const fs = require('fs');
//创建读取流,读取a.txt文件
let readStream = fs.createReadStream('mi.jpg');
//定义一个空字符串,用于拼接数据
let str = '';
//记录读取次数
let count = 0;
//开始读取数据
//data就是数据事件,chunk是每个数据的分片
//count表示读取多少次
readStream.on('data', function(chunk) {
    str += chunk;
    count++;
})
//读取完毕后
readStream.on('end', function(chunk) {
    console.log(count);
    // console.log(str);
})
//读取失败的处理
readStream.on('error', function(err) {
    console.log(err);
})

11.写入流

1.创建写入流,会创建某个文件
    let writeStream = fs.createWriteStream('str.txt');
2.写入文件,并结束
    writeStream.write(str,'utf-8');
    writeStream.end();
3.写入结束事件
    writeStream.on('finish',function(){
        console.log('写入完成');
    })
const fs = require('fs');
let str = "我是从数据库获取的数据";
//创建写入流
let writeStream = fs.createWriteStream('str.txt');
//循环写入100句这个内容
for (let i = 0; i < 100; i++) {
    writeStream.write(str, 'utf-8');
}
//标记写入完成
writeStream.end();
//写入完成的事件
writeStream.on('finish', function() {
    console.log('写入完成');
})
//写入失败的事件
writeStream.on('error', function() {
    console.log('写入失败');
})

12.管道流

文件读取: 适合小文件,直接先将文件读入内存中,然后再存起来
管道流读取: 适合大文件进行拷贝,传输,将文件分片,慢慢传输.(读取流,写入流,管道流)
fs.createReadStream()  读取文件流
fs.createWriteStream() 写入文件流
http://www.zymseo.com/node/434.html
const fs = require('fs');
//创建一个读取流
let readStream = fs.createReadStream('snow.mp3');
//创建一个写入流
let writeStream = fs.createWriteStream('mysnow.mp3');
//管道读写操作,读取snow.mp3到新创建的mysnow.mp3,实现文件拷贝
readStream.pipe(writeStream);

2.path模块

path模块提供了一些方法,用来解决路径拼接的问题(可以简单理解为字符串拼接)
路径拼接: path.join(路径1,路径2)  拼接两个路径
路径获取:  path.resolve()   返回当前目录的绝对路径
获取路径:path.dirname(filepath)
获取文件名:path.basename(filename)
获取扩展名:path.extname(filepath)
//重点掌握: path.join() 和path.resovle()
//https://blog.csdn.net/NextStand/article/details/59535555
const path = require('path');
var str = path.join('demo','test');
console.log(str);
//返回当前目录的全局路径
var a = path.resolve();
console.log('本地路径'+a);
//获得当前的文件夹名字
var b = path.dirname('demo/a.txt');
console.log(b);
//获取文件名
var c = path.basename('demo/a.txt')
console.log(c);
// 获取文件的后缀名
var d = path.extname('demo/a.txt');
console.log(d);

3.全局对象模块

__filename 表示当前正在执行的脚本的文件名
__dirname 表示当前执行脚本所在的目录。
//单次和多次定时
setTimeout(cb, ms)
clearTimeout(t)
setInterval(cb, ms)
clearInterval(t)

4.node中常见模块的总结

1.npm的常见命令使用
2.node的模块引入(4种,1个注意点)
3. node中的常用模块
    http模块
    url模块
    fs文件模块
    path 路径模块
    global 全局模块

5.node中操作mysql数据库

1.下载mysql包,并引入
2. 创建连接 mysql.createConnection(数据库参数对象)---得到连接
3. 开始连接  conn.connect();
4.查询数据库 conn.query(sql语句,参数数组,回调函数)
5.结束连接  conn.end();

1.查询数据

const mysql = require('mysql');
//1.创建数据库连接
const conn =mysql.createConnection({
    host: '127.0.0.1',
    user: 'root',
    password: '',
    database: 'qd01',
    port: '3306'
})
// 2.开始连接
conn.connect();
// 3.查询语句
let sql = 'select * from user';
conn.query(sql,function(err,rows){
    if(err) throw err;
    console.log(rows);
})

//4.结束连接
conn.end();
//返回错误的两种写法,如果数据库错误,就会报错
  if(err){
      console.log(err);
      return false;
  }
//简易写法
    if(err) throw err;

2.添加数据

1.sql中使用?当占位符
2.conn.query(sql语句,参数数组,function(err,result){})
3. affectedRows受影响行数
const mysql = require('mysql');
//1.创建数据库连接
const conn =mysql.createConnection({
    host: '127.0.0.1',
    user: 'root',
    password: '',
    database: 'qd01',
    port: '3306'
})
// 2.开始连接
conn.connect();
// 3.查询语句
let sql = 'insert into user(name,age,sex,tel) values(?,?,?,?)';
let params = ['任正非',29,1,'111111'];
conn.query(sql,params,function(err,result){  
    if(err) throw err;
    console.log(result);
    if(result.affectedRows>0){
        console.log('插入成功')
    }else{
        console.log('插入失败');
    }
})
//4.结束连接
conn.end();

3.删除数据

//删除,如果只有一个参数,就直接写,不用当数组
let sql = 'delete from user where id=?';
let params = 13;
conn.query(sql,params,function(err,result){  
    if(err) throw err;
    console.log(result);
    if(result.affectedRows>0){
        console.log('删除成功')
    }else{
        console.log('删除失败');
    }
})

4.修改数据

//修改
let sql = 'update user set name =? where id=?';
let params = ['曹操111',12];
conn.query(sql,params,function(err,result){  
    if(err) throw err;
    console.log(result);
    if(result.affectedRows>0){
        console.log('修改成功')
    }else{
        console.log('修改失败');
    }
})

5.数据库连接池

1.创建连接池对象mysql.createPool(配置)
2.从连接池中获得数据库连接对象  pool.getConnection()
3.查询数据库 conn.query(sql语句,参数,回调)
4.释放连接 conn.release();
query(sql语句,参数,回调函数)
参数的写法: 一个值,直接写
          多个值用数组[参数1,参数2]
          如果插入的数据有多个,可以用对象,但是insert语句的写法就要修改
          insert into users set ?
          后面就可以写对象
const mysql = require('mysql');
const dbconfig = {
    host: '127.0.0.1',
    user: 'root',
    password: '',
    database: 'qd01',
    port: '3306'
}
//1.创建数据库连接池对象
const pool = mysql.createPool(dbconfig);
let sql = 'select * from user';
//获得连接对象
pool.getConnection(function(err,conn){
    //查询数据
    conn.query(sql,function(err,rows){
        console.log(rows);
        //释放连接
        conn.release();
    })
})

6.数据库返回到页面

const http = require('http');
const mysql = require('mysql');
//创建服务器
let server = http.createServer(function(req,res){  
    res.end(JSON.stringify(userDate));      
})
server.listen(3000,function(){
    console.log('服务器启动了')
})
let userDate = '空数据';
//数据库相关的操作
const dbconfig = {
    host: '127.0.0.1',
    user: 'root',
    password: '',
    database: 'qd01',
    port: '3306'
}
//1.创建数据库连接池对象
const pool = mysql.createPool(dbconfig);
let sql = 'select * from user';
//获得连接对象
pool.getConnection(function(err,conn){
    //查询数据
    conn.query(sql,function(err,rows){
        userDate=rows;
        console.log(rows);
        //释放连接
        conn.release();
    })
})

总结

1.node安装

2.模块的导入导出
//a.js
module.exports = {//对象和方法}
//index.js
var m = require('./a.js');
console.log(m.name);
m.run();
3.http模块
    http.createServer(function(req,res){})  //http模块的createServer方法,会返回一个服务器对象
    server.listen(端口);    //服务器对象,调用listen方法来监听端口
    res.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"}); //响应头
    res.write();  //返回数据内容
    res.end();   //结束返回(可以包含res.write)----建议使用
    req.url     //可以获得用户请求的网址路径
4.url模块
    let urlObj=url.parse(请求路径,true);   //将参数包装成对象
    urlObj.query.username  //获得用户名
    urlObj.query.password  //获得密码 
5.热重载工具
    nodemon
6.fs模块
    fs.stat  检测是文件还是目录
    fs.mkdir  创建目录
    fs.writeFile  创建写入文件
    fs.appendFile  追加文件
    fs.readFile   读取文件
    fs.readdir    读取目录
    fs.rename    重命名
    fs.rmdir     删除目录
    fs.unlink    删除文件
    fs.createReadStream  从文件流中读取数据
    fs.createWriteStream 写入文件流数据
    管道流概念: 实现大文件传输(小文件一次性传输过去,大文件慢慢传)
7.path模块
    路径拼接: path.join(路径1,路径2)  拼接两个路径
    路径获取:  path.resolve()   返回当前目录的绝对路径
    获取路径:path.dirname(filepath)
    获取文件名:path.basename(filename)
    获取扩展名:path.extname(filepath)
8.全局模块
    __filename 表示当前正在执行的脚本的文件名
    __dirname 表示当前执行脚本所在的目录。
9.node操作数据库
    1.创建连接
    2.开始连接
    3.查询数据库
    4.关闭连接