首页 > 编程语言 >2020-2-20-nodejs基础知识

2020-2-20-nodejs基础知识

时间:2024-03-22 17:02:03浏览次数:25  
标签:20 log err nodejs res 2020 var console data

vs插件安装、快速运行、url模块使用、自动重启工具supervisor、自定义模块、下载第三方包、fs模块、Async、Await的使用、文件里、简易静态服务器、事件驱动EventEmitter、模拟登陆简单版、模拟express封装、操作mongodb数据库

VScode插件安装

需要安装Node Snippets插件才会有提示


快速运行

var http=require('http')
http.createServer((req,res)=>{
    //req 请求对象,可获取请求的url等信息
    //res 响应对象
    console.log(req.url)
    res.writeHead(200,{"Content-type":"text/html;charset='utf-8"})
    res.write("<head><meta charset='UTF-8'></head>")//解决乱码
    res.write("你好,hello")//向前台返回内容
    res.end()//结束响应,注释掉前台将会一直请求
}).listen(3000)

url模块的使用

//对于get方式传值好用
const url=require('url')
let api="www.zhanghuan.top?name=zhanghuan&age=20"
let parse_reasult=url.parse(api,true).query
console.log(parse_reasult)//[Object: null prototype] { name: 'zhanghuan', age: '20' }

自动重启动工具supervisor

1)安装

npm install -g supervisor

2)使用supervisor代替node命令启动应用

supervisor server.js

自定义模块

新建一个文件夹module,里面放置js文件,一个js文件就是一个自定义模块,例如在module里新建request.js文件

1)创建模块

//request.js里的代码
class request{
    static get(){
        console.log("get方法")
    }
    static post(){
        console.log("post方法")
    }
}
//对外暴露写法1,选择性暴露
//exports.request=request

//对外暴露写法2,将整个对象暴露
module.exports=request

2)导入模块

//在modules外部app.js中
var req=require('./modules/request')
req.get()//输出 get方法

3)node_modules系统方式自定义模块

新建一个node_modules的文件夹,里面建一个axios文件夹,里面新建一个index.js的文件,那么在外部(与node_modules同级的js文件中)可直接使用require('./axios')导入文件

注意:如果axios里的js文件命名不是index.js,用这种方法导入会报错。解决办法是,在axios文件里打开命令窗口,输入npm init --yes


下载第三方包

1初始化

npm init --yes

生成配置文件package.json,package-lock.json

2安装包

例如我们要安装MD5的包

npm install --save

注意:这里的--save会将安装的包名记录到配置文件中,别人拿到配置文件后运行命令npm install便可安装所有依赖

指定包的版本安装

npm install [email protected]

3常见的包

silly-datetime(日期格式化)

mkdirp(创建文件)

4删除模块

1)简单方法

npm uninstall md5

2)另一种方法

在package.json中的dependencies属性下,删除掉该模块,然后删除掉node_modules文件夹,再重新执行npm install

5配置文件里dependencies属性里的表示符

"dependencies": {
    "md5": "^2.2.1"
  }

^表示第一位版本号不变,后面两位取最新

~表示前两位不变,最后一个取最新

*表示全部取最新


fs模块

1fs.stat('dir',callback)判断路径是否存在

fs.stat(path,(err,data)=>{
    if(err){
        console.log(err)
    }else{
        //data是一个名为status的对象,这个对象有isDirectory()和isFile()方法,调用以查看该路径是否是文件
        console.log(data.isDirectory())
        console.log(data.isFile())
    }
})

2fs.mkdir('dir',callback)创建路径

3fs.writeFile('dir','file.content',callback)新建文件

4fs.appendFile('dir','append content',callback)文件追加内容

5fs.readFile('dir',callback)

6fs.readDire('dir',callback)阅读目录下包含的所有文件和文件夹

7fs.rename('dir','new dir',callback)重命名或移动文件

8fs.rmdir('dir',callback)删除路径,前提是路径下不包含任何文件和文件夹

9fs.unlin('dir',callback)删除路径下的文件

例子:使用回调函数取出目标路径下所有文件的文件名

const fs=require('fs')
var dir='../../../desktop'//查找的地址
var lis=[]//查找到的文件放置在这里
function get_filename(dir){
    fs.readdir(dir,(err,data)=>{
        if(err){
            console.log(err)
            return
        }else{
            if(data==[]){
                return
            }
            (function getdir(i){
                if(i==data.length){
                    return
                }
                var path=dir+'/'+data[i]
               fs.stat(path,(err,status)=>{
                    if(status.isFile()){//如果传过来的是文件,添加到lis中
                        lis.push(path)
                    }else{//如果传过来的是路径,进行递归
                        get_filename(path)
                    }
               })
                getdir(i+1)
            })(0)
            //这里不可以用for循环迭代,因为fs是异步的,用递归方式替代for循环
        }
    })
}
get_filename(dir)
var t=setInterval(()=>{
    console.log(lis)//因为fs是异步的,所以会执行更长时间,这里等待3秒后输出结果
    clearInterval(t)
},3000)

Async、Await的使用

async是声明一个异步的function,await是等待一个异步function的执行完成并获取异步function返回的数据,注意await外部包裹的方法必须是异步方法(扩展:所有返回为Promise的函数都可以用await获取其resolve的值)

async function test(){
    return new Promise((resolve,reject)=>{
        t=setInterval(()=>{       
            clearInterval(t)
            resolve("你好")
        },3000)
    })
    
}

async function main(){
    var data=await test()//外部必须是异步函数包裹
    console.log(data)//3秒后执行这一行,和下面这一行
    console.log("hello")
}
main()

取出目标路径下所有文件的文件名异步版本

const fs=require('fs')
var dir='../../../desktop'//查找的地址
var lis=[]//查找到的文件放置在这里
async function dir_isFile(path){
    //@params path路径
    //根据路径判断是否是文件,如果是文件返回真
    return new Promise((resolve,reject)=>{
        fs.stat(path,(err,status)=>{
            if(err){
                console.log(err)
            }
            resolve(status.isFile())
        })
    })
}
function get_filename(dir){
    fs.readdir(dir,async (err,data)=>{//函数内需要使用await,所以必须定义成异步函数
        if(err){
            console.log(err)
            return
        }else{
            if(data==[]){
                return
            }
            for(var item of data){
                var path=dir+'/'+item
                if(await dir_isFile(path)){
                    lis.push(path)
                }else{
                    get_filename(path)
                }
            }
           
        }
    })

}

get_filename(dir)
var t=setInterval(()=>{
    console.log(lis)
    clearInterval(t)
},10000)   

文件流

1读取流

const fs=require('fs')
var readstream=fs.ReadStream('new_file','utf-8')
var num=0//记录读取次数
readstream.on('data',(data)=>{
    console.log(data)//输出读取的数据
    num++//每读取一次加一
})
readstream.on('end',()=>{
    console.log("--end--")
    console.log(num)//输出10,说明读取了10次
})
readstream.on('error',(err)=>{
    console.log(err)//读取过程中出现错误就输出错误
})

2写入流

const fs=require('fs')
var writestream=fs.WriteStream('new_file')
for(var i=0;i<10000;i++){
    writestream.write('阅读使人充实,会谈使人敏捷,写作使人精确。\n')
}
writestream.end()//标记末尾,未标记末尾的文件不可以触发以下的完成事件
writestream.on('finish',()=>{
    console.log("写入完成")
})

3管道流

const fs=require('fs')
var readstream=fs.ReadStream('new_file')
var writestream=fs.WriteStream('./files/new_file1')
readstream.pipe(writestream)//通过管道将new_file文件复制到'./files/new_file'里,注意复制前files文件夹必须存在

简易静态web服务器

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

http.createServer(function (request, response) {
    var req_path=request.url;
    if(req_path!='/favicon.ico'){
        var pathname='.'+url.parse(req_path).pathname
        var ext_name=path.extname(pathname)//获取后缀名
        fs.readFile(pathname,(err,data)=>{
            if(err){
                fs.readFile('./static/404.html',(err,data)=>{
                    response.writeHead(200, {'Content-Type': "text/html"});
                    response.write(data)
                    response.end();
                })
            }else{
                var head_obj=JSON.parse(fs.readFileSync('./static/mime.json').toString())//根据后缀名匹配出返回的请求头
                if(ext_name in head_obj){
                    var content_type=head_obj[ext_name]
                }else{
                    var content_type='text/plain'
                }
                response.writeHead(200, {'Content-Type': content_type});
                response.write(data)
                response.end();
            }
        })
    }
  

  
}).listen(8081);

console.log('Server running at http://127.0.0.1:8081/');

事件驱动EventEmitter

var events=require('events');
var EventEmitter=new events.EventEmitter();

EventEmitter.on('data1',(data)=>{
    console.log(data)
})

EventEmitter.emit('data1',"this is data")//this is data

模拟登陆简单版

1app.js文件

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

http.createServer(function (request, response) {
    if(request.url!="/favicon.ico"){
        var pathname=url.parse(request.url).pathname
        if(pathname='/login'){
            if(request.method=='GET'){
                ejs.renderFile('./templates/login.ejs',{},(err,data)=>{
                    response.end(data)
                })
            }else{
                var posstr=""
                request.on('data',chunk=>{
                    posstr+=chunk
                })
                request.on('end',()=>{
                    var data_obj=querystring.parse(posstr)
                    response.writeHead(200,{'Content-Type': "text/html"})
                    if(data_obj['username']=='zhanghuan'&&data_obj['password']=='123'){
                        response.end("<script>alert('suceess');history.back()</script>")
                    }else{
                        response.end("<script>alert('username or password is not correct');history.back()</script>")
                    }
                    
                })
            }
            
        }
    }
  
}).listen(8081);

console.log('Server running at http://127.0.0.1:8081/');

2模板文件login.ejs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>login</p>
    <form action="/login" method="post">
        <input type="text" placeholder="用户名" name="username">
        <input type="text" placeholder="密码" name="password">
        <button>提交</button>
    </form>
    
</body>
</html>

模拟express的简单封装

1封装文件server.js代码

var url=require('url');
var server=function(){
    var G=this
    G._get={}
    G._post={}

    var app=function(req,res){
        var pathname=url.parse(req.url).pathname+'/'
        if(pathname=='/favicon.ico/'){
            return
        }
        if(!G._get[pathname]){//如果没有定义该路由,直接返回
            res.end("no such router")
        }
        if(req.method=='GET'){
            try {
                G._get[pathname](req,res)//执行_get里对应的方法
            } catch (error) {
                res.end("err")
            }
        }
        if(req.method=='POST'){
            try {
                var str=""
                req.on('data',(chunk)=>{
                    str+=chunk
                })
                req.on('end',()=>{
                    req.body=str
                    G._post[pathname](req,res)//执行_post里对应的方法
                })
                
            } catch (error) {
                res.end("err")
            }
        }
    }

    app.get=function(string,callback){
        if(!string.startsWith('/')){
            string='/'+string
        }
        if(!string.endsWith('/')){
            string=string+'/'
        }
        if(string=='/'){
            string='//'
        }
        G._get[string]=callback
    }

    app.post=function(string,callback){
        if(!string.startsWith('/')){
            string='/'+string
        }
        if(!string.endsWith('/')){
            string=string+'/'
        }
        if(string=='/'){
            string='//'
        }
        G._post[string]=callback
    }

    return app
}

module.exports=server()

2文件app.js

var http = require('http');
var app=require('./server.js');
var ejs=require('ejs');
var querystring=require('querystring')

http.createServer(app).listen(8081);

app.get('/',(req,res)=>{
    res.writeHead(301, {'Location': '/login'});//实现重定向
    res.end();
})

app.get('/login',(req,res)=>{
    ejs.renderFile('./templates/login.ejs',{},(err,data)=>{
        res.end(data)
    })
})
app.post('/login',(req,res)=>{
    var data_obj=querystring.parse(req.body)
    if(data_obj['username']=='zhanghuan'&&data_obj['password']=='123'){
        res.end("<script>alert('suceess');history.back()</script>")
    }else{
        res.end("<script>alert('username or password is not correct');history.back()</script>")
    }
})
console.log('Server running at http://127.0.0.1:8081/');


操作mongodb数据库

1安装模块

npm install mongodb --save-dev

2导入模块并连接

var MongoClient=require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017',(err,client)=>{
     if(err){
         console.log(err)
     }
     var db=client.db("db01")//连接到db01数据库
     //所有关于数据库db01的操作都对db发起即可
     //db.collection('user')
     //拿到user表,可对其进行增删改查操作
 })

3对表格的操作

1)新增

var insert_obj={'name':'zhanghua','age':21]}
db.collection('user').insertOne(insert_obj,(err,data)=>{
	if(err){
		console.log(err)
	}
	res.end("insert success")
})

2)删除

db.collection("user").deleteOne({'name':'zhanghuan'},(err,data)=>{
	if(err){
		console.log(err)
	}
	res.end("delete success")
})

3)修改

var update_obj={'name':'zhanghuan123'}
db.collection("user").updateOne({'name':'zhanghuan'},{$set:update_obj},(err,data)=>{
	if(err){
		console.log(err)
	}
	res.end("update success")
})

4)查找

db.collection('user').find({}).toArray((err,result)=>{
	client.close()
	console.log(result)//拿到的结果会以数组形式存在result里         
})

4用户列表增删改查的案例

这里是在模拟的express框架下进行操作

1)app.js文件

var http = require('http');
var app=require('./server.js');
var ejs=require('ejs');
var querystring=require('querystring');
var url=require('url');
var querystring=require('querystring');
var MongoClient=require('mongodb').MongoClient;
var ObjectID = require('mongodb').ObjectID;
var db_url='mongodb://localhost:27017';

http.createServer(app).listen(8081);

//用户列表
app.get('/user',(req,res)=>{
    MongoClient.connect(db_url,(err,client)=>{
        if(err){
            console.log(err)
            res.end('db error')
        }
        var db=client.db("db01")
        
        db.collection('user').find({}).toArray((err,result)=>{
            client.close()
            ejs.renderFile('./templates/content.ejs',{'list':result},(err,data)=>{
                if(err){
                    console.log(err)
                }
                res.end(data)
            })            
        })
        
    })
    
})

//删除用户
app.get('/userdel',(req,res)=>{
    MongoClient.connect(db_url,(err,client)=>{
        if(err){
            console.log(err)
            res.end('db error')
        }
        var db=client.db("db01")
        var _id=querystring.parse(url.parse(req.url).query)['id']
        _id=new ObjectID(_id)
        db.collection("user").deleteOne({'_id':_id},(err,data)=>{
            if(err){
                console.log(err)
                res.end('delete failure')
            }
            res.end("delete success")
        })
    })
})

//新增用户
app.get('/adduser',(req,res)=>{
    ejs.renderFile('./templates/adduser.ejs',{'obj':''},(err,data)=>{
        res.end(data)
    })
})
app.post('/adduser',(req,res)=>{
    var data_obj=querystring.parse(req.body)
    MongoClient.connect(db_url,(err,client)=>{
        if(err){
            console.log(err)
            res.end('db error')
        }
        var db=client.db("db01")
        var insert_obj={'name':data_obj['name'],'age':data_obj['age'],'sex':data_obj['sex'],'job':data_obj['job']}
        db.collection('user').insertOne(insert_obj,(err,data)=>{
            if(err){
                console.log(err)
                res.end('insert failure')
            }
            res.end("insert success")
        })
    })
})

//更新用户
app.get('/userupdate',(req,res)=>{
    MongoClient.connect(db_url,(err,client)=>{
        if(err){
            console.log(err)
            res.end('db error')
        }
        var db=client.db("db01")
        var _id=querystring.parse(url.parse(req.url).query)['id']
        _id=new ObjectID(_id)
        db.collection('user').find({'_id':_id}).toArray((err,result)=>{
            client.close()
            ejs.renderFile('./templates/adduser.ejs',{'obj':result[0],'current_url':req.url},(err,data)=>{
                if(err){
                    console.log(err)
                }
                res.end(data)
            })            
        })
        
    })
})
app.post('/userupdate',(req,res)=>{
    var data_obj=querystring.parse(req.body)
    MongoClient.connect(db_url,(err,client)=>{
        if(err){
            console.log(err)
            res.end('db error')
        }
        var db=client.db("db01")
        var _id=querystring.parse(url.parse(req.url).query)['id']
        _id=new ObjectID(_id)
        var update_obj={'name':data_obj['name'],'age':data_obj['age'],'sex':data_obj['sex'],'job':data_obj['job']}
        db.collection("user").updateOne({'_id':_id},{$set:update_obj},(err,data)=>{
            if(err){
                console.log(err)
                res.end('update failure')
            }
            res.end("update success")
        })
    })
})

console.log('Server running at http://127.0.0.1:8081/');

2)adduser.ejs

{% raw %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>add or update</title>
</head>
<body>
    <%if(obj){%>
        <form action=<%=current_url%> method="post">
            <input type="text" name='name' placeholder="name" required value=<%=obj.name%>>
            <input type="text" name='age' placeholder="age" required value=<%=obj.age%>>
            <input type="text" name='sex' placeholder="sex" required value=<%=obj.sex%>>
            <input type="text" name='job' placeholder="job" required value=<%=obj.job%>>
            <button>提交</button>
        </form>
    <%}%>
    <%if(!obj){%>
        <form action="/adduser" method="post">
            <input type="text" name='name' placeholder="name" required>
            <input type="text" name='age' placeholder="age" required>
            <input type="text" name='sex' placeholder="sex" required>
            <input type="text" name='job' placeholder="job" required>
            <button>提交</button>
        </form>
   <% }%>
    
</body>
</html>
{% endraw %}

3)content.ejs

{% raw %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>userlist</h1>
    <table>
        <tr>
            <th>name</th>
            <th>age</th>
            <th>sex</th>
            <th>job</th>
            <th>operation</th>
        </tr>
        <%for(item of list){%>
            <tr>
                <td><%=item.name%></td>
                <td><%=item.age%></td>
                <td><%=item.sex%></td>
                <td><%=item.job%></td>
                <td><a href="userdel?id=<%=item._id%>">删除</a><a href="userupdate?id=<%=item._id%>">更新</a></td>
            </tr>
        <%}%>
    </table>
    <br>
    <button><a href="/adduser">新增用户</a></button>
</body>
</html>
{% endraw %}

标签:20,log,err,nodejs,res,2020,var,console,data
From: https://www.cnblogs.com/sylvesterzhang/p/18089843

相关文章

  • 2020-3-7-webpack打包工具
    概述、快速使用、配置文件、webpack-dev-server、babel使用概述为优化页面发送多次的二次请求导致加载速度变慢和处理错综复杂的文件依赖关系,则需要将项目中涉及的多个文件进行合并并重新构建。wepack是一个基于node.js项目构建工具,其构建方式是基于项目构建。安装npmiwebp......
  • 2020-5-11-Mybatis
    框架和架构、MyBatis概述、入门、增删改查操作、dao实现类增删改查、引用外部配置文件、配置实体类别名、注册指定包内的dao接口、动态sql、一对多查询、多对多查询、延迟加载、mybatis缓存、注解开发框架和架构1框架软件开发的一套解决方案,不同框架解决不同问题。框架中封装很......
  • P5657 [CSP-S2019] 格雷码
    #include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cmath>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;typedefunsignedlonglongUll;constunsignedlonglo......
  • 海思 SS927V100 HI3519AV200 简介
    海思SS927V100HI3519AV200简介HI3519AV200是一颗专业ultra-HDSmartIPCameraSOC。SS927V100(另称:22AP70、SD3402)功能以及封装与HI3519AV200完全一致,可以平替HI3519AV200。最高支持四路sensor输入,支持最高4K60的ISP图像处理能力,支持3FWDR、多级降噪、六轴......
  • 2020-5-5-JAVAWEB
    测试、反射、注解、Mysql、JDBC、Tomcat、servlet、HTTP、EL表达式、JSTL、Filter过滤器、代理模式、监听器、Redis、Maven测试1黑白盒测试黑盒测试:不需要写代码,给输入值,看程序能否给出期望的输出值白盒测试:需要写代码,关注程序具体执行流程2测试步骤1)定义测试类包名:cn.itca......
  • 2020-5-23-Spring
    简介、耦合、控制反转、依赖注入、注解方式反转控制和依赖注入、Spring整合Junit、银行转账案例、代理、AOP面向切面编程、JDBCTemplate简介1核心内容IOC反向控制、AOP面向切面编程2优势方便解耦,简化编程AOP编程支持声明式事务支持方便程序的测试方便集成各种优秀的框架......
  • JetBrains全家桶激活,分享 WebStorm 2024 激活的方案
    大家好,欢迎来到金榜探云手!WebStorm公司简介JetBrains是一家专注于开发工具的软件公司,总部位于捷克。他们以提供强大的集成开发环境(IDE)而闻名,如IntelliJIDEA、PyCharm、和WebStorm等。这些工具被广泛用于Java、Python、JavaScript等编程语言的开发,因其智能化和高效性......
  • JetBrains全家桶激活,分享 CLion 2024 激活的方案
    大家好,欢迎来到金榜探云手!CLion公司简介JetBrains是一家专注于开发工具的软件公司,总部位于捷克。他们以提供强大的集成开发环境(IDE)而闻名,如IntelliJIDEA、PyCharm、和WebStorm等。这些工具被广泛用于Java、Python、JavaScript等编程语言的开发,因其智能化和高效性而......
  • 2020-1-1-GIT使用经验汇总
    Git安装、创建版本库、同步操作、分支管理、查看版本记录、远程仓库相关操作安装sudoapt-getinstallgit设置用户名和邮箱gitconfig--globaluser.name"yourname"gitconfig--globaluser.email"[email protected]"创建版本库1.创建目录mkdirlearniggitcdlearn......
  • 2020-1-3-ekyll安装使用
    jekyll是一个博客工具,将markdown文件生成静态网页,具有较好的迁移性。安装依赖包RubyRubyGemsNodeJsPython安装完成后重启电脑配置gem镜像$gemsources--addhttps://gems.ruby-china.com/--removehttps://rubygems.org/$gemsources-l安装jeckyll-pagination$g......