首页 > 编程语言 >Node.js学习随笔

Node.js学习随笔

时间:2022-11-19 23:25:19浏览次数:78  
标签:Node node err db js 模块 var 随笔

Node.js

Node.js不是JS,但是和JavaScript的语法非常相似,是一种服务器端技术,他的竞争对手PHP/JAVA/C++/C#/PYTHON - 历史上第一次一门语言可以通吃前后端 - 前端崛起原因之一 ​ Node:前端 <=桥梁(服务器端)=>数据库的

node.js安装运行

  • 目的:

    1. 通过node.js书写代码来搭建一个私网服务器,让我们局域网内的人员可以来进行访问 - 免费

    2. 搭配上数据库玩全栈

  • 下载安装:

    LTS长效稳定版 - 双击node-v18.12.1-x64.msi,一直点下一步,不要取消任何东西,就装C盘 检查自己是否安装成功:打开cmd输入node -v回车如果你能看到版本号则安装成功

  • 运行:

    我们安装的node.js其实是一个运行环境,可以让我们的js脱离浏览器运行,但其实已经不是javascript,只是和JavaScript长得很相似的Node.js

    1. 交互模式:- 用于临时测试 打开cmd输入node回车,就可以开始敲你的"js"语句 输入一行执行一行

    2. 脚本模式 - 开发常用方式 建一个xx.js文件,里面书写您的"js"代码 , 打开cmd输入node 完整的文件绝对路径,回车

    3. 随着编辑器慢慢的强大,我们编辑器有了插件: 前提:cmd可用,才能安装插件 1、HBuilder:node eclipse - 安装好了重启HBuilder,然后对着文件代码处右键运行 2、VSCode:code runner - 安装好了重启VSCode,然后对着文件代码处右键第一个选项就可以运行,或者 右上有个开始按钮

       

  • JavaScript和Node.js区别:

    1. JavaScript:ES+DOM+BOM

    2. Node:ES一切东西都可用,但是没有DOM和BOM,意味着他不是做特效,很成百上千上万个【模块】等待我们学习

 

模块

一个web项目功能可以分为很多个不同的模块,比如商品模块、用户模块、支付模块、促销模块、商家模块... node.js按照功能的不同,可以将函数、对象分别放到不同的文件/目录下,这些文件/目录在node.js中就称之为是一个模块,暂时可以简单理解为xx.js就是一个模块

Node.js中模块的分类
  1. 官方模块 - 不需要下载安装,在你安装node.js环境的时候就已经安好了

  2. 第三方模块 - 需要用npm去下载,多的一批:mongoose(数据库)、express(Node的框架,简化原生Node的)

  3. 自定义模块:目前说白了就是一个xx.js

 

*模块化开发(自定义模块):分工合作、明确责任
         node底层其实有一句话,我们虽然看不见:
  (function(exports,require,三个){
  //exports - {}空对象,放在此空对象里面的,向外部公开自己的成员 - 公开/暴露/导出
  //require - 函数,引入其实模块 - 引入
  //你写的代码
  })()
  1. *主模块 - 引入别的模块进行使用 var xx=require("./模块文件名");//xx就是别人公开的对象

    特殊:./不可以省略

  2. *分支/子模块 - 公开东西给别人使用

    1. 第一种方式: exports.属性名=属性值; exports.方法名=function(){};

    2. 第二种方式: module.exports={ 属性名:属性值, 方法名:function(){}; }

官方模块学习

官方模块不确定要不要引入,理论来说需要观看官方文档,但是有为师在

  1. global全局对象模块 - 不需要引入的,可以直接使用的,全局对象依然可以省略不写,提供了一些全局的属性和方法

    • exports: 空对象,此对象是可以公开属性和方法的。用于向外导出自己的成员

    • require:函数,此函数是用于引入其他模块的

    • __filename:属性,此属性会获得当前模块的完整的绝对路径

    • __dirname:属性,此属性会获得当前模块的完整的绝对路径,但是不包含模块名,只有路径名 - 对vscode你们有的人有用:你可能在node.js某一处不允许使用相对路径,但是你写绝对路径又怕累,怎么办,就靠__dirname

    • module:指代当前模块本身!包含着以上4个操作

    • 以下两个人不是当初的人,但是用法和当初一致

      1. console:控制台对象(js里面是window.console.log(); 这里是global.console.log())

      2. 定时器:周期性和一次性和瞬间定时器

    • 面试题:

      1. exports可以公开,那module.exports也可以公开,他们的区别在哪里

        node.js底层有一句话:var exports=module.exports;意味着两个人其实都可以公开/暴露 ​ 但是如果你用了这句话: exports={},就覆盖了上面module.exports这句话,不再具有公开暴露的功能了 ​ 真正具有公开功能的是module.exports

     

  2. querystring模块 - 查询字符串:提供了解析查询字符串的API,解析为一个对象,方便你拿到前端传来的查询字符串的各个部分

     需要引入:var qs=require("querystring");//官方模块不用加 ./
      var obj=qs.parse("查询字符串部分");
     缺陷:只能解析查询字符串部分
  3. ***url模块 - 解析前端传来的完整的url网址的各个部分

     需要引入:var url = require('url');   //官方模块不用加 ./
      var obj=url.parse("完整的url",true);//一旦加了true,则会自动调用querystring模块的parse方法再解析查询字符串部分
     重点:
      *获取路由:obj.pathname;
      *获取请求消息:obj.query.键名;
  4. buffer模块 - 缓冲区,本质是一块内存区域,用于暂存以后可能用到的数据(数字、字符串、二进制图片、视频、音频),该区域就称之为缓存。不需要引入的直接使用 可以给想要的数据分配缓冲区,变成一个我们不认识的十六进制的一串数字

       var buf=Buffer.from("hello world");

    ​ 注意:buffer我们可以简单理解为是一个node.js新提供的数据类型,但不方便我们认识/看懂,此方法我们绝对不会手动使用, ​ 但是node中的别的API可以执行了某个操作过后,就会返回我们一个buffer类型,也别怕,因为node中大部分API是支持直接使用buffer

  5. **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
  6. ***http模块 - 代码搭建http服务器 - 大重点

    http:请求和响应模式,有请求才有响应,一个请求一个响应

    • 功能:

      1. 可以接受前端发来的请求消息的

      2. 解析前端发来的请求消息

      3. 根据前端的需求我们回去去读请求到的文件,响应给他看

    • 使用:固定用法:

    •  //引入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、以后会有更多的路由可能是跟数据库挂钩的
  7. 自定义模块:两种形式

    学了这个你就知道为什么有的模块要加./引入,有的模块不用加./引入

    1. *文件模块 创建一个xx.js,导出需要公开的数据,主模块想要引入必须写为require("./文件路径")

    2. 目录模块 方式1:创建一个文件夹,名为m1,其中再创建一个名为index.js的文件导出需要公开的数据,主模块想要引入必须写为require("./文件夹路径") 方式2:创建一个文件夹,名为m2,其中再创建一个名为xx.js的文件导出需要公开的数据,但是需要再创建一个必须名为package.json的配置文件写入:{"main":"xx.js"},主模块想要引入必须写为require("./文件夹路径") *方式3:创建一个文件夹,必须名为node_modules,再在其中创建一个文件夹:名为m3,其中再创建一个名为index.js的文件导出需要公开的数据,主模块想要引入必须写为require("m3") 第三种方式看上去最屌,但是操作起来最麻烦,而且这个玩意儿根本不是给人用的,给机器自动生成的,理论上来说我们正式开发自己会使用的是文件模块

  8. 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是非关系型语言

安装&启动步骤:

  1. 解压呆老湿提供的mongodb-win32-x86_64-2008plus-ssl-3.6.11,放到哪里都可以

  2. 我们得到了一个bin文件夹里面有:mongo.exe(客户端) 和 mongod.exe(服务器端)

  3. 如何启动:

    • 打开命令行:输入:.\mongod.exe --dbpath=你想要保存的绝对文件地址 - mongo数据库的服务器已经启动成功 .\mongod.exe --dbpath=D:\mongoyx

      • 千万不要关闭此命令行

    • 再打开一个命令行:输入:.\mongo.exe - 再检查上一个命令行看看连接是否成功 - mongo数据库的客户端已经启动成功

 

mongo语法:都是运行在mongo客户端的命令行中

  • 数据库操作:

    1. 查询数据库:show dbs

    2. 创建/切换数据库:use 数据库名称;

    3. 查看当前选中的数据库:db

    4. 创建数据表:db.createCollection("表名") - 一定要先创建表后,才能看到自己创建的数据库,不做限制

    5. 删除数据库:db.dropDatabase(); - 不要记忆,删除公司的数据库会坐牢3年起步

     

  • 数据表操作:

    1. 创建数据表:db.createCollection("表名",{size:5242880,capped:true,max:5000}) - 最大存储空间为5mb,存储最多5000个数据,意味着做了一个限制,我不推荐

    2. 查看目前所有的数据表:db.getCollectionNames();

    3. 删除数据表:db.表名.drop();

     

  • 数据操作:

    1. 增:db.表名.save({键值对,...}) - 一次只能插入一条数据

      db.表名.save([{},{},{},{}]) - 一次插入多条数据

    2. 删:db.表名.remove({}) - 会删除数据表中所有的数据,不推荐(数据库中一切的删除都要小心:一旦删除就回不来)

      db.表名.remove({pwd:"123123"}) - 只会删除数据库中pwd:123123的数据

       

    3. 改:db.表名.update({pwd:"999999"},{$set:{name:"xxx"}}) - 找到pwd为999999的,修改name为xxx

    4. 查:

       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

  1. 安装mongoose第三方模块 --npm安装

  2. 使用步骤:

    1. 引入:var mongoose = require('mongoose');

    2. 服务器端【连接】数据库:mongoose.connect("mongodb://127.0.0.1/h52205");

    3. 创建/选择一个数据表的同时,设置数据类型的控制,防止用户乱输

      •  //创建数据类型
          const userSchema=mongoose.Schema({
          name: String,
          age: Number,
          pwd: String
          })
          //创建数据表以及设置数据类型
          //           模型名称
          var User=mongoose.model("User",userSchema,"数据表名");
    4. 新增:

      •  //使用模型/构造函数 - 创建出我们需要新增的对象
          var user=new User({
          name:"dy1",
          age:20,
          pwd:"123123"
          })
          //把创建好的对象,放到数据库中
          user.save((err)=>{//回调函数:
          console.log(err);//检查错误或者返回东西给前端
          })
    5. 删除:

      •  User.remove/deleteOne/deleteMany({age:18},(err)=>{//不推荐remove再mongoose第三方模块中已经被淘汰了,会有一个警告
          console.log(err);//检查错误或者返回东西给前端
          })
    6. 修改:

      •  User.update/updateOne/updateMany({条件},(err)=>{//不推荐update再mongoose第三方模块中已经被淘汰了,会有一个警告
          console.log(err);//检查错误或者返回东西给前端
          })
    7. 查找:

      •  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

相关文章

  • js一键通关
    1.typeof运算符和instanceof运算符以及isPrototypeOf()方法的区别typeof是一个运算符,用于检测数据的类型,比如基本数据类型null、undefined、string、number、boolean,以及......
  • js undefined null 区别
    在JavaScript中存在这样两种原始类型:Null与Undefined。这两种类型常常会使JavaScript的开发人员产生疑惑,在什么时候是Null,什么时候又是Undefined?Un......
  • js 右下角动态提示消息框
    js:varsheyMsg=function(box,options){this.box=this.g(box);this.setOptions(options);this.init();}sheyMsg.prototype={ae:function(e......
  • js cookie 操作
    functiongetCookie(name)...{varvalue=document.cookie;vararr1=value.split(";");for(i=0;i<arr1.length;i++)...{if(value.length=......
  • js实现树的存储和遍历
    树的概念:树这样的结构挺起来十分的吓人,实际上非常的简单,树是由一个个节点组成A//\\BCDE//\FGH我们使用数组来存储......
  • 关于GET/POST请求传输时URL编码的介绍记录随笔
    UTF-8编码的汉字:少数是汉字每个占用3个字节,多数占用4个字节#GET请求编码Chrome会先把URL中非ASCII字符按照某种编码格式(谷歌浏览器是UTF-8)编码成byte数组后,然后转成16进......
  • node 安装配置 及 cnpm 和node 版本不兼容问题
    新电脑回来安装node配置环境 node=>npm=>cnpm=>yarn=>淘宝镜像node下载安装, 一直next到安装成功。刚开始下的16.18的版本,起vue2项目因为node-sass版......
  • JS数据类型与对象
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title></head><body><!--数据类型与对象--><script>......
  • js输出、弹窗
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title><script>window.alert("弹窗");//document.get......
  • JS语法语句、变量
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title></head><body><!--语法与语句,变量--><!--......