NodeJs 学习

325 阅读4分钟

基础概念

初识

  1. nodejs是什么? 运行环境,支持在服务端运行js,使用的Google V8引擎
  2. 除了不能使用DOM和BOM 其他js的用法都能上
  3. 跟js一样属于单线程,但js只能跟浏览器打交道,NodeJs使得js还能能跟操作系统打交道,对磁盘读写
  4. 用java做后端不好吗? 对开发人员而言nodejs开发更快,你去实践一下就知道真香了,nodejs适合运用在高并发、I/O密集、少量业务逻辑的场景,对于比较大型的系统还是会优先选Java,多线程处理CPU重的系统还是挺6的,emmm

模块化

nodeJs 会自动给每个js文件都用 function(exports,require,module,__filename,__dirname)包裹
函数的返回值为module.exports 跟exports 指向一个地址,module.exports的为准
require('xxx') 引入外部模块会返回一个对象,并执行模块自身内容(自调用函数)

核心模块

fs http path os url等等

  1. fs文件操作模块
fs.mkdir('/xxx',err=>{})
f.writeFile('/xxx','hello',err=>{})
f.appendFile('/xxx','+hello'err=>{})
f.readFile('/xxx','utf8',(err,data)=>{})
// 大文件可创建stream流
const resource =fs.createReadStream('/xxx')
const dist=fs.createWriteStream('/xxx')
resource.pipe(dist)
  1. http模块
http.createServer((req,res)=>{}).listen('3000')
  1. Buffer缓冲区 起源:起初js语言没有二进制数据类型,在处理文件流(二进制数据的流动)时必须要使用到二进制数据,因此nodeJs搞了个Buffer类,每当要处理I/O操作移动数据时就可能用到这个Buffer。
    用于处理二进制数据流。
    类似数组,呃,本质跟数组没大关系,只不过它存放的是二进制数据(用16进制显示),一个元素占一个字节
xxx=Buffer.from() // 创建一个Buffer对象
xxx.toString('编码格式') //二进制转字符
Buffer.alloc(size) // 创建一个指定大小的Buffer

PS:写一个项目下来基本上没用到,因为很多小框架已经把它封装好了
4. path

不用引入path,通用路径: __dirname:当前所在文件夹的目录路径;__filename:当前文件目录路径 

在文件操作路径上使用相对路径不可靠,因为那是相对于执行node命令所处的路径而言!!

补充

服务端渲染:可以使用art-template等插件作为模版引擎(处理文件特殊字符标志的数据替换),在初次请求页面时就在服务端把数据都填充好。
缺点:页面显示慢。
客户端渲染:服务端仅仅把页面传过来,数据还得另作请求。
缺点:不利于SEO,异步渲染SEO查不到。
项目可采用两种渲染方式相结合,像商品列表页采用服务端渲染,有利于用户搜索,评论列表用客户端渲染,速度更快。

实战

工具

  1. express :更方便操作http模块
中间件
app.get('/home',(req,res,next)=>{next()})
app.get('/home',(req,res,next)=>{res.send('hhhh')})
中间件就是一个函数 ,对请求处理做了一些特定封装,然后把处理结果返回给下一个中间件使用(next),直到遇到没有next的中间件
针对一个请求可以设置多个中间件,进行多次处理(重上往下匹配)

app.use((req,res,next)=>{}) // app.use匹配所有请求方式,直接传入请求函数,表示对所有请求统一处理
app.use(‘/home’,(req,res,next)=>{})针对特定路径处理
app.use('/home',authMiddleware(),(req,res)=>()) 封装中间件后这样子写也可以
app.use((err,req,res,next)=>{}) 接收四个参数时统一对抛出的错误进行处理,err来自上一个中间件next(err)
  1. mongoDB数据库
安装(一些工具模块还得再去官网下载复制到mongdb bin 下)
/usr/local cd /usr/local  
// 下载 
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.9.tgz  
// 解压 
sudo tar -zxvf mongodb-osx-ssl-x86_64-4.0.9.tgz  
// 重命名为 mongodb 目录 
sudo mv mongodb-osx-x86_64-4.0.9/ mongodb
Mac bash配置
vim ~/.bash_profile
export PATH=/Users/tao/go/bin:$PATH  //添加
source ~/.bash_profile
mongod 启动
mongo  进入mongo操作(最好下个视图软件mongobooster)
show dbs 查看数据库列表
use '数据库名称'  切换到指定数据库
db  查看当前连接到数据库
db.student.find() 查表内容
show collections 查所有表

mac上配置后重新打开终端无法提示找不到命令,如果你在Mac上使用的是zsh等shell工具,需要再做如下配置:

vim ~/.zshrc
// 添加
if [ -f ~/.bash_profile ]; then
   source ~/.bash_profile
fi
// 执行
source ~/.zshrc
  1. 服务端实用性包

npm i mongoose 代码中更方便操作mongodb
npm i nodemon -g 热更新项目,使用nodemon xxx.js
服务端想使用session 可安装npm i express-session
npm i multer 专门处理上传文件中间件
multer-aliyun-oss OSS上传图片插件 bctypt 密码加密 jsonwebtoken 生成token

  1. 客户端实用性包

npm i less less-loader@7.3.0 -D (用webpack4要指定版本号)
使用:
import VueAwesomeSwiper from 'vue-awesome-swiper'
import 'swiper/css/swiper.css'
Vue.use(VueAwesomeSwiper)

vue add element
vue add axios
vue add router
npm i vue2-editor 富文本编辑器
npm i swiper@5.4.5  vue-awesome-swiper (记得加版本不然报错) npm i dayjs 时间日期库更轻量

步骤

服务端:

npm i -y 初始化项目
新建index.js 做入口
在package.json 自定义脚本:serve: nodemon index.js
引入express创建web服务 npm run serve 启动
新建文件db.js 使用mongoose统一连接数据库
新建文件夹models,放表结构schema
封装路由const router=express.Router({mergeParams:true}) router.get....exports
在入口一一引入,注意顺序

前端:

vue create xxx
配置路由
全局公共样式配置

发布和部署

  1. 生产环境配置
    .env.development 配置开发 .env.production 配置生产
    执行npm run build 编译目标文件指向服务端某个文件
    然后在服务器入口index.js配置静态资源开放

    app.use('/public',express.static(__dirname+'/public')) // public也要公开
    app.use('/admin',express.static(__dirname+'/public/admin'))
    app.use('/',express.static(__dirname+'/public/web'))
    
  2. 买:服务器+域名(去实名)、配置域名解析、服务器安全组添加80端口、去备案域名(选xg的可不用备案)

  3. 装:服务器使用命令行安装Ngnix 、Node(配淘宝镜像)、Git、MongoDb、pm2(后台启动类似nodemon)

    yum install git
    sudo yum install nginx
    sudo systemctl enable nginx  设置开机启动
    sudo systemctl start nginx 启动命令
    sudo systemctl status nginx 检查nginx的状态
    yum install -y nodejs  //-y自动应答yes-----npm -v 有毛病,改用nvm 安装
    1.  git clone git://github.com/creationix/nvm.git ~/nvm
    2.  echo "source ~/nvm/nvm.sh" >> ~/.bashrc
    3.  source   ~/.bashrc
    4.  nvm install v16.14.0
    5.  nvm use v16.14.0
    6.  node -v    npm -v
    
    mogodb装的时候失败了好几次~~(跟版本有关系)
    vim /etc/yum.repos.d/mongodb.repo
    然后把下面的复制进去
    [mongodb-org]
    name=MongoDB Repository
    baseurl=http://mirrors.aliyun.com/mongodb/yum/redhat/7/mongodb-org/4.2/x86_64/
    gpgcheck=0
    enabled=1
    安装
    sudo yum install -y mongodb-org
    npm install -g pm2  //要不要软链接
    
    npm install pm2@latest -g
    pm2 start index.js  //运行
    
    • 配:git
    git config --global user.name "xx"
    git config --global user.email xx@xx.com
    ssh-keygen
    一路回车
    cat xxxx.pub
    复制粘贴到git的ssh中
    
    • 配:nginx配置
    在 /etc/nginx/conf.d 下面创建一个配置文件叫 default.conf,内容如下:
    server {
      listen 80;
      location / {
          proxy_pass http://xx.xx.xx.xx:xxxx; 
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection 'upgrade';
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-Proto $scheme;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_cache_bypass $http_upgrade;
      }
    }
    删除掉/etc/nginx/nginx.conf里面定义的 server  
    
    systemctl start nginx 启动
    改了配置需要systemctl reload nginx
    如果80端口起不来可试试:
    firewall-cmd --zone=public --add-port=80/tcp --permanent
    firewall-cmd  --reload
    
    • mongodb 命令
    sudo systemctl start mongod  启动
    sudo systemctl stop mongod 关闭
    sudo systemctl restart mongod 重启
    sudo systemctl enable mongod 开机自启动
    sudo systemctl status mongod 查看启动状态
    
    • mongodb 本地数据库迁移:
    mongodump -d '数据库'
    将生成的文件拷贝至服务器中 
    在服务端执行mongorestore 即可
    

4.服务器git拉代码 启动服务端即可