Node.js
Node.js不是JS,但是和JavaScript的语法非常相似,是一种服务器端技术,他的竞争对手PHP/JAVA/C++/C#/PYTHON - 历史上第一次一门语言可以通吃前后端 - 前端崛起原因之一 Node:前端 <=桥梁(服务器端)=>数据库的
node.js安装运行
-
目的:
-
通过node.js书写代码来搭建一个私网服务器,让我们局域网内的人员可以来进行访问 - 免费
-
搭配上数据库玩全栈
-
-
下载安装:
LTS长效稳定版 - 双击node-v18.12.1-x64.msi,一直点下一步,不要取消任何东西,就装C盘 检查自己是否安装成功:打开cmd输入node -v回车如果你能看到版本号则安装成功
-
运行:
我们安装的node.js其实是一个运行环境,可以让我们的js脱离浏览器运行,但其实已经不是javascript,只是和JavaScript长得很相似的Node.js
-
交互模式:- 用于临时测试 打开cmd输入node回车,就可以开始敲你的"js"语句 输入一行执行一行
-
脚本模式 - 开发常用方式 建一个xx.js文件,里面书写您的"js"代码 , 打开cmd输入node 完整的文件绝对路径,回车
-
随着编辑器慢慢的强大,我们编辑器有了插件: 前提:cmd可用,才能安装插件 1、HBuilder:node eclipse - 安装好了重启HBuilder,然后对着文件代码处右键运行 2、VSCode:code runner - 安装好了重启VSCode,然后对着文件代码处右键第一个选项就可以运行,或者 右上有个开始按钮
-
-
JavaScript和Node.js区别:
-
JavaScript:ES+DOM+BOM
-
Node:ES一切东西都可用,但是没有DOM和BOM,意味着他不是做特效,很成百上千上万个【模块】等待我们学习
-
模块
一个web项目功能可以分为很多个不同的模块,比如商品模块、用户模块、支付模块、促销模块、商家模块... node.js按照功能的不同,可以将函数、对象分别放到不同的文件/目录下,这些文件/目录在node.js中就称之为是一个模块,暂时可以简单理解为xx.js就是一个模块
Node.js中模块的分类
-
官方模块 - 不需要下载安装,在你安装node.js环境的时候就已经安好了
-
第三方模块 - 需要用npm去下载,多的一批:mongoose(数据库)、express(Node的框架,简化原生Node的)
-
自定义模块:目前说白了就是一个xx.js
*模块化开发(自定义模块):分工合作、明确责任
node底层其实有一句话,我们虽然看不见:
(function(exports,require,三个){
//exports - {}空对象,放在此空对象里面的,向外部公开自己的成员 - 公开/暴露/导出
//require - 函数,引入其实模块 - 引入
//你写的代码
})()
-
*主模块 - 引入别的模块进行使用 var xx=require("./模块文件名");//xx就是别人公开的对象
特殊:./不可以省略
-
*分支/子模块 - 公开东西给别人使用
-
第一种方式: exports.属性名=属性值; exports.方法名=function(){};
-
第二种方式: module.exports={ 属性名:属性值, 方法名:function(){}; }
-
官方模块学习
官方模块不确定要不要引入,理论来说需要观看官方文档,但是有为师在
-
global全局对象模块 - 不需要引入的,可以直接使用的,全局对象依然可以省略不写,提供了一些全局的属性和方法
-
exports: 空对象,此对象是可以公开属性和方法的。用于向外导出自己的成员
-
require:函数,此函数是用于引入其他模块的
-
__filename:属性,此属性会获得当前模块的完整的绝对路径
-
__dirname:属性,此属性会获得当前模块的完整的绝对路径,但是不包含模块名,只有路径名 - 对vscode你们有的人有用:你可能在node.js某一处不允许使用相对路径,但是你写绝对路径又怕累,怎么办,就靠__dirname
-
module:指代当前模块本身!包含着以上4个操作
-
以下两个人不是当初的人,但是用法和当初一致
-
console:控制台对象(js里面是window.console.log(); 这里是global.console.log())
-
定时器:周期性和一次性和瞬间定时器
-
-
面试题:
-
exports可以公开,那module.exports也可以公开,他们的区别在哪里
node.js底层有一句话:var exports=module.exports;意味着两个人其实都可以公开/暴露 但是如果你用了这句话: exports={},就覆盖了上面module.exports这句话,不再具有公开暴露的功能了 真正具有公开功能的是module.exports
-
-
-
querystring模块 - 查询字符串:提供了解析查询字符串的API,解析为一个对象,方便你拿到前端传来的查询字符串的各个部分
需要引入:var qs=require("querystring");//官方模块不用加 ./
var obj=qs.parse("查询字符串部分");
缺陷:只能解析查询字符串部分 -
***url模块 - 解析前端传来的完整的url网址的各个部分
需要引入:var url = require('url'); //官方模块不用加 ./
var obj=url.parse("完整的url",true);//一旦加了true,则会自动调用querystring模块的parse方法再解析查询字符串部分
重点:
*获取路由:obj.pathname;
*获取请求消息:obj.query.键名; -
buffer模块 - 缓冲区,本质是一块内存区域,用于暂存以后可能用到的数据(数字、字符串、二进制图片、视频、音频),该区域就称之为缓存。不需要引入的直接使用 可以给想要的数据分配缓冲区,变成一个我们不认识的十六进制的一串数字
var buf=Buffer.from("hello world");
注意:buffer我们可以简单理解为是一个node.js新提供的数据类型,但不方便我们认识/看懂,此方法我们绝对不会手动使用, 但是node中的别的API可以执行了某个操作过后,就会返回我们一个buffer类型,也别怕,因为node中大部分API是支持直接使用buffer
-
**fs模块 - 全称filesystem - 文件系统 - 重点!
fs模块提供了对象文件系统中的文件进行读写的功能
需要引入:
var fs=require("fs");
//异步:不会卡住后续代码的,这块代码就算再耗时也无所谓,后续代码先跑了,我们慢慢做 - 异步才能发挥我们node.js的特点/优点
//*读取文件:
fs.readFile("文件路径",(err,buf)=>{
buf - 就是你读取到的东西,只不过自动转为了buffer类型
})
//写入文件:
fs.writeFile("文件路径","新内容"/buf,(err)=>{
//用于你写入完毕后要做什么
})
//追加文件:
fs.appendFile("文件路径","新内容"/buf,(err)=>{
//用于你写入完毕后要做什么
})
注意:vscode的部分同学可能不能再此处书写相对路径,只能写绝对路径__dirname -
***http模块 - 代码搭建http服务器 - 大重点
http:请求和响应模式,有请求才有响应,一个请求一个响应
-
功能:
-
可以接受前端发来的请求消息的
-
解析前端发来的请求消息
-
根据前端的需求我们回去去读请求到的文件,响应给他看
-
-
使用:固定用法:
-
//引入http、url、fs模块
var http=require("http");
var url=require("url");
var fs=require("fs");
//创建服务器应用
var app=http.createServer();
//设置服务器的监听端口号
app.listen(80);
//为服务器绑定请求监听事件 - request:请求,想要触发请求事件,那必须前端来发起请求,我们都没有接收到请求自然不会执行
app.on("request",(req,res)=>{
//req - request:请求对象,有一个非常重要的属性,req.url可以得到前端传来的路由和请求消息!解析req.url,单独得到路由部分,通过判断前端的路由的不同的,做不同的响应
var objUrl=url.parse(req.url,true);
//单独获取路由部分
var router=objUrl.pathname;
//判断你的路由给你响应不同的内容
if(router=="/index.html" || router=="/"){
//res - response:响应对象,有一个非常重要的方法:res.end("后端想要给前端东西"),前端就不会一直转圈圈了
fs.readFile("./public/html/index.html",(err,buf)=>{
res.end(buf);
})
}else if(router.match(/html/)!=null){//响应其他的html
fs.readFile("./public/html"+router,(err,buf)=>{
res.end(buf);
})
}else if(router.match(/css|js|jpg|png|gif|woff|woff2|ttf/)!=null){//响应其他的资源
fs.readFile("./public"+router,(err,buf)=>{
res.end(buf);
})
}
})
特殊:
1、有的同学,可能写不了相对路径,必须书写绝对路径
2、一旦搭配服务器端不允许出现中文路径
3、以后会有更多的路由可能是跟数据库挂钩的
-
-
自定义模块:两种形式
学了这个你就知道为什么有的模块要加./引入,有的模块不用加./引入
-
*文件模块 创建一个xx.js,导出需要公开的数据,主模块想要引入必须写为require("./文件路径")
-
目录模块 方式1:创建一个文件夹,名为m1,其中再创建一个名为index.js的文件导出需要公开的数据,主模块想要引入必须写为require("./文件夹路径") 方式2:创建一个文件夹,名为m2,其中再创建一个名为xx.js的文件导出需要公开的数据,但是需要再创建一个必须名为package.json的配置文件写入:{"main":"xx.js"},主模块想要引入必须写为require("./文件夹路径") *方式3:创建一个文件夹,必须名为node_modules,再在其中创建一个文件夹:名为m3,其中再创建一个名为index.js的文件导出需要公开的数据,主模块想要引入必须写为require("m3") 第三种方式看上去最屌,但是操作起来最麻烦,而且这个玩意儿根本不是给人用的,给机器自动生成的,理论上来说我们正式开发自己会使用的是文件模块
-
-
NPM:Node Package Manager:Node.js的第三方模块包/模块管理器:可用于下载、更新、删除、维护包的依赖关系 npm不需要下载安装,再你安装node.js的时候就已经安装好了 检查一下是否有npm:打开cmd:输入npm -v 如果有版本号出现说明你电脑里已经有了npm 打开npm官网:www.npmjs.org,搜索我想要的模块 下载:npm i 包名; 更新:npm up 包名; 删除:npm un 报名;
毕竟npm是国外的,下载速度可能很慢,你希望快一点可以先安装一个cnpm: npm install cnpm -g --registry=https://registry.npmmirror.com
mongoDB:DATABASE - 数据库
学习mongo语句的目的,是为了和node.js(桥梁)进行搭配
mongo是非关系型语言
安装&启动步骤:
-
解压呆老湿提供的mongodb-win32-x86_64-2008plus-ssl-3.6.11,放到哪里都可以
-
我们得到了一个bin文件夹里面有:mongo.exe(客户端) 和 mongod.exe(服务器端)
-
如何启动:
-
打开命令行:输入:.\mongod.exe --dbpath=你想要保存的绝对文件地址 - mongo数据库的服务器已经启动成功 .\mongod.exe --dbpath=D:\mongoyx
-
千万不要关闭此命令行
-
-
再打开一个命令行:输入:.\mongo.exe - 再检查上一个命令行看看连接是否成功 - mongo数据库的客户端已经启动成功
-
mongo语法:都是运行在mongo客户端的命令行中
-
数据库操作:
-
查询数据库:show dbs
-
创建/切换数据库:use 数据库名称;
-
查看当前选中的数据库:db
-
创建数据表:db.createCollection("表名") - 一定要先创建表后,才能看到自己创建的数据库,不做限制
-
删除数据库:db.dropDatabase(); - 不要记忆,删除公司的数据库会坐牢3年起步
-
-
数据表操作:
-
创建数据表:db.createCollection("表名",{size:5242880,capped:true,max:5000}) - 最大存储空间为5mb,存储最多5000个数据,意味着做了一个限制,我不推荐
-
查看目前所有的数据表:db.getCollectionNames();
-
删除数据表:db.表名.drop();
-
-
数据操作:
-
增:db.表名.save({键值对,...}) - 一次只能插入一条数据
db.表名.save([{},{},{},{}]) - 一次插入多条数据
-
举例:
db.user.save([{"name":"猎魔人","age":18,"pwd":"666666","email":"[email protected]"},{"name":"袍哥","age":19,"pwd":"999999","email":"[email protected]"},{"name":"袍哥","age":20,"pwd":"999999","email":"[email protected]"},{"name":"袍哥","age":21,"pwd":"999999","email":"[email protected]"},{"name":"袍哥","age":22,"pwd":"999999","email":"[email protected]"}])
-
-
删:db.表名.remove({}) - 会删除数据表中所有的数据,不推荐(数据库中一切的删除都要小心:一旦删除就回不来)
db.表名.remove({pwd:"123123"}) - 只会删除数据库中pwd:123123的数据
-
改:db.表名.update({pwd:"999999"},{$set:{name:"xxx"}}) - 找到pwd为999999的,修改name为xxx
-
查:
db.表名.find() - 所有表格中的数据
db.表名.find({age:18}) - 找到所有年龄为18的
db.表名.find({age:{$gt:19}}) - 找到所有年龄大于19的 gte大于等于19
db.表名.find({name:/正则/}) - 甚至可以写正则进行模糊查询
db.表名.find({},{name:1,pwd:1}) - 只需要name和pwd,其余的不要,1和0都相当于是开关(只要登录必拿用户名和密码)
db.表名.find().sort({age:1}) - 按照age升序排列,-1为降序(后端数据库排序了,前端就不必了)
db.表名.find().skip(2).limit(2) - 跳过前2条,再拿2条,可以立即理解为2-4条数据(只要做分页条)
db.表名.find().count() - 获取此表有多少条数据(只要做分页条,拿到总数据/每页数据=多少分页)
-
-
安装mongodb-compass-1.33.1-win32-x64 数据库图形化界面 - 一般只用于查看,方便我们观看即可,以后我们就不用打开cmd了
Node.js操作mongoDB
-
安装mongoose第三方模块 --npm安装
-
使用步骤:
-
引入:var mongoose = require('mongoose');
-
服务器端【连接】数据库:mongoose.connect("mongodb://127.0.0.1/h52205");
-
创建/选择一个数据表的同时,设置数据类型的控制,防止用户乱输
-
//创建数据类型
const userSchema=mongoose.Schema({
name: String,
age: Number,
pwd: String
})
//创建数据表以及设置数据类型
// 模型名称
var User=mongoose.model("User",userSchema,"数据表名");
-
-
新增:
-
//使用模型/构造函数 - 创建出我们需要新增的对象
var user=new User({
name:"dy1",
age:20,
pwd:"123123"
})
//把创建好的对象,放到数据库中
user.save((err)=>{//回调函数:
console.log(err);//检查错误或者返回东西给前端
})
-
-
删除:
-
User.remove/deleteOne/deleteMany({age:18},(err)=>{//不推荐remove再mongoose第三方模块中已经被淘汰了,会有一个警告
console.log(err);//检查错误或者返回东西给前端
})
-
-
修改:
-
User.update/updateOne/updateMany({条件},(err)=>{//不推荐update再mongoose第三方模块中已经被淘汰了,会有一个警告
console.log(err);//检查错误或者返回东西给前端
})
-
-
查找:
-
User.find({条件-上午教你的},(err,result)=>{
console.log(result);
})
例:
User.find({ name: "yxx" }, (err, result) => { //result是找到的值
console.log(result);
})
User.find({},{ name:1,pwd:1,_id:0}, (err, result) => { //筛选
console.log(result);
})
User.find({}, (err, result) => { //跳过第一个数据,选中后面的2个数据
console.log(result); //result,找到的数据
}).skip(1).limit(2)
-
-
标签:Node,node,err,db,js,模块,var,随笔 From: https://www.cnblogs.com/SenorCoconut/p/16907501.html