nodejs全栈开发学习笔记

2023-11-05

为什么学nodejs,因为听说学会了nodejs可以做全栈开发,哈哈,我也是一个有野心的程序员(其实并没有)。

 

nodejs学了好几次,也放弃了好几次,主要原因就是感觉莫名其妙(自学),跟前端开发联系不上,光是环境搭建(Windows系统)就卡死了好几次,明明是跟着教学视频(自学失败几次后买了教学视频)一步步学的,就是没有人家的效果,时间长了就从入门到放弃,但既然买了课程,虽然实践不了,但我也强撑着把视频看完了,不然多浪费。

 

最近,我发现了一门合适的课程,重燃了我对nodejs学习的兴趣和信心,又发现了周边的一门课,也很好,简直是为我量身打造的,哈哈,狠狠心,花了五百多大洋(为此我还专门进行了深刻的反省,你说买件衣服一千多的不嫌贵,怎么买课程就小气了呢,不应该),买下了课程,付完款的那一刻我异常轻松和开心,哈哈,感觉就像已经学会了所买的课程似的。

 

这里要打个广告,慕课网付费好课程分享给大家(先说好,我是不会借账号的)。知识是需要付费的,尊重版权,尊重作者。另外,只有花费得来的东西,才会珍惜,才会认真。

 

买七月老师的小程序nodejs课程,是因为我前面看了配套的小程序开发课程,学了前端,正好补足后端。

 

双越老师的nodejhs博客项目是套餐推荐买的,我看了介绍,也挺合适,就一起买了。实践证明,一起买非常明智。先看的七月老师的课,呃,起点有点高,而且小程序我也不熟,看了几节课看不下去了,就去看双越老师的课,嗯,体验很好,渐进式学习,浏览器这边也比较熟悉(我是web前端),在学习中也可以及时弥补不足,相信等双越老师的课看完,再去看七月老师的课会顺畅点。

 

废话有点多,正文来了。本文主要目的是记录学习中遇到的问题及解决方法,方便以后忘记了可以查阅。

 

Node.js 概述

js运行环境--解释器 ;

服务器端语言,使用一种语言统一了前后端的开发;

使用ECMScript语法规范,提供nodejs API,可处理http,处理文件等;

没有BOM和DOM对象 ;

可以在终端使用(命令行),node 进入--输入js代码,回车执行(使js脱离了浏览器可以运行),也可以执行js文件。

 

环境准备(Mac os 系统)

下载brew

https://brew.sh/

to install Homebrew,paste that in a macOS Terminal prompt.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

 

下载nvm

不同项目使用的nodejs的版本可能不一样,使用nodejs的版本管理工具 nvm 可以切换多个nodejs版本。

安装nvm

brew install nvm

安装完成后使用 nvm list 查看当前所有的node版本,提示命令不可用,先卸载吧,暂时也用不上。

brew uninstall nvm 

 

下载nodejs

https://nodejs.org/en/download/

nodejs安装后测试

node -v

 

npm

nodejs 自带npm,查看npm版本。

npm -v

新建一个项目时,在项目根目录,初始化npm的配置文件。

npm init -y

npm init  与 npm init [--force|-f|--yes|-y|--scope] 的区别:前面是交互式命令行,提示输入各种信息,后面的全都使用默认值。

 

搭建开发环境

下载nodemon

npm i nodemon cross-env --save-dev

使用nodemon 监测文件变化,自动重启node;

使用cross-env设置环境变量,兼容Mac Linux 和 window;

 

"dev": "cross-env NODE_ENV=dev nodemon ./bin/www.js",

"prd": "cross-env NODE_ENV=production nodemon ./bin/www.js"

 

使用postman 模拟发送post请求

遇到的问题:获取不到postman发送的值。

有道翻译了下,翻译结果如下:

自签名SSL证书被阻塞: 通过在设置> General中关闭“SSL证书验证”来修复这个问题。 至此找到解决方法。

 

获取不到 postdata 其他原因

//这里的content-type要是小写

if(req.headers['content-type'] !== 'application/json'){     resolve({})     return }

 

cookie

存储在浏览器的一段字符串,最大5kb;

跨域不共享;

格式k1=v1;k2=v2;k3=v3; 可存储结构化数据;

每次发送http请求,会将请求域中的cookie 一起发送给sever;

server 可以修改cookie 并返回给浏览器;

浏览器可以通过js修改cookie(服务器端可限制 http-only ,仅允许服务器端修改cookie);

 

登录解决方案

1、cookie (弃用)

问题:暴露信息;存储量小;

2、session(弃用)

cookie中存储userid ,server 端对应 username 。

问题:session 存储在进程中,多进程之间数据不共享;操作系统会限制一个进程的最大可用内存。

3、使用redis

优势:内存数据库(mysql 是硬盘数据库),访问速度块,独立可扩展。

 

安装redis

brew install redis

 

redis使用

 

和前端联调

登录功能依赖cookie,需使用浏览器调试;

cookie跨域不共享,前端和server端使用 nignx 做代理达到同域目的;

 

nginx

高性能的web服务器,开源免费;

一般用于做静态服务、负载均衡、反向代理;

 

下载 nginx

brew install nginx

 

使用 nginx

测试配置文件是否正确 nginx -t

启动 nginx

重启 nginx -s reload

停止 nginx -s stop

 

配置nginx

打开配置文件

sudo vi /usr/local/etc/nginx/nginx.conf

刚启动 vim,便进入了命令模式。

按下i,切换到输入模式,以输入字符。

在输入模式中,可以使用 ESC 退出输入模式,切换到命令模式。

命令模式中使用英文 :  切换到底线命令模式,以在最底一行输入命令,:wq 储存后离开。

按ESC键可随时退出底线命令模式。

 

 

服务器用 8000,web端用 8001开启 http-server 服务,静态页面访问 8080。

 

注意:需要重启nginx使修改的配置生效。

重启报错:

/usr/local/var/run/nginx/nginx.pid" failed (2: No such file or directory)

解决:

nginx -c /usr/local/etc/nginx/nginx.conf

然后再 nginx -s reload 或者 nginx -s reopen

 

启动项目

启动nginx

不报错表示启动成功

 

日志

写日志

const fs = require('fs')

const path = require('path')

 

//写日志

function writeLog(writeStream,log){

writeStream.write(log+'\n')

}

 

//生成 write stream

function createWriteStream(fileName){

const fullFileName = path.join(__dirname,'../','../','logs',fileName)

const writeStream = fs.createWriteStream(fullFileName,{

flag:'a'

})

return writeStream

}

 

//写访问日志

const accessWriteStream = createWriteStream('access.log')

 

function access(log){

writeLog(accessWriteStream,log)

}

 

module.exports={

access

}

 

拆分日志

#!/bin/sh

cd /Users/mumu/Documents/code/blog-1/logs

cp access.log $(date +%y-%m-%d).access.log

echo "" > access.log

 

分析日志

const fs = require('fs')

const path = require('path')

const readline = require('readline')

 

//文件名

const fileName = path.join(__dirname,'../','../','logs','access.log')

//创建 readStream

const readStream = fs.createReadStream(fileName)

 

//创建 readline 对象

const rl = readline.createInterface({

input:readStream

})

 

let chromeNum = 0

let sum = 0

 

//逐行读取

rl.on('line',lineData=>{

if(!lineData){

return

}

 

sum ++

 

const arr = lineData.split('--')

if(arr[2] && arr[2].indexOf('Chrome') > 0){

chromeNum ++

}

})

 

//监听读取完成

rl.on('close',()=>{

console.log('chrome 占比',(chromeNum/sum*100).toFixed(2),' %')

})

 

项目安全

预防 sql 注入

escape:mysql.escape

 

const login = (username,password)=>{

username = escape(username)

password = escape(password)

const sql =`select username,realname from users where username=${username} and password=${password}`;

return exec(sql).then(rows=>{

return rows[0] || {}

})

}

 

预防xss攻击

 

密码加密 

使用加密算法加密密码

const crypto = require('crypto')

//密钥

const SECRET_KEY = 'fWyuJiol_1687*76#'

//md5加密

function md5(content){

let md5 = crypto.createHash('md5')

return md5.update(content).digest('hex')

}

//加密函数

function genPassword(password){

const str = `password=${password}&key=${SECRET_KEY}`

return md5(str)

}

// const result = genPassword('123')

// console.log('加密后的密码是:',result)

module.exports = {

genPassword

}

 

使用框架 express

express下载

npm install express-generator -g

 

开始一个express项目

express express-test

npm install

npm run dev

 

 

使用框架koa2

koa下载之普通安装

npm i koa

 

koa下载之使用脚手架安装

默认前端视图文件(view)使用的是 pug

npm install koa-generator -g

 

开始一个koa2项目

koa2 koa2-test

 

npm install

 

安装环境参数

npm i cross-env --save-dev

 

修改入口文件 bin/www.js 中端口(默认端口3000)

var port = normalizePort(process.env.PORT || '8000');

 

启动项目

npm run dev

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nodejs全栈开发学习笔记 的相关文章

随机推荐

  • Hadoop-HBase 单机部署

    一 系统版本 Linux系统 wdOS 1 0 x86 64 iso 关于wdOS说明 1 安装简单 快速 去掉了安装过程中不必要的烦锁操作和不必要的选择 2 可选安装集成web环境 如lamp lnmp lnamp 并可相互自由切换使用
  • 设计模式之适配器模式(Adapter)

    1 定义 适配器模式 Adapter 指的是将一个类的接口转换成另一个可以兼容的接口 比如我们日常生活中的转换头 古早时期使用的电池万能充 就相当于程序中使用的适配器模式 2 适配器模式的种类 2 1 类适配器模式 类适配器模式通过多重继承
  • 大数据项目实战——基于某招聘网站进行数据采集及数据分析(三)

    大数据项目实战 第三章 数据采集 文章目录 大数据项目实战 学习目标 一 分析与准备 1 分析网页结构 2 数据采集环境准备 二 采集网页数据 1 创建响应结果 JavaBean 类 2 封装 HTTP 请求的工具类 1 定义三个全局变量
  • 14张自动化测试框架结构图(建议收藏)

    1 接口自动化测试框架设计图 接口自动化测试框架设计图 2 接口自动化执行设计图 接口自动化执行设计图 3 API自动化平台框架设计图 API自动化平台框架设计图 4 UI自动化测试框架设计图 UI自动化测试框架设计图 5 接口 UI自动化
  • 【CUDA基础练习】向量内积计算的若干种方法

    先从一个简单 直观的方法来了解如何用CUDA计算向量内积 向量内积既然是将两个向量对应元素相乘的结果再求和 我们先考虑将对应元素相乘并行化 再来考虑相加 方法一 include
  • 十八、kubernetes中容器重启策略

    1 概述 在上一篇文章中 一旦容器探测出现了问题 kubernetes就会对容器所在的Pod进行重启 其实这是由pod的重启策略决定的 pod的重启策略有 3 种 分别如下 Always 容器失效时 自动重启该容器 这也是默认值 OnFai
  • oracle行转列(PIVOT),列转行(UNPIVOT)

    1 行转列 PIVOT 现有 学生 分数表 STUDENT SCORE 如下 想看到每个学生语数外的整体分数情况 这时候可以应用行转列 PIVOT SELECT FROM STUDENT SCORE PIVOT SUM SCORE FOR
  • C++应用到C# ref , out

    include stdafx h include iostream h int factor int int int void main int number squard cubed error cout lt lt Enter the
  • 泰勒展开式求sin(x)

    include
  • Java架构直通车——分布式唯一 ID生成方案

    文章目录 分布式ID的几种生成方案 UUID MySQL主键自增 数据库自增ID改进方案 雪花算法 SnowFlake 雪花算法的优化 Redis自增id Zookeeper有序节点 最近要做区块链项目 要生成很多唯一ID做业务号之类的 所
  • 快速排序算法的Python实现 (头歌实践教学平台)

    任务描述 本关任务 编写代码实现快速排序 相关知识 为了完成本关任务 你需要掌握 1 如何实现快速排序 2 快速排序的算法分析 快速排序 快速排序使用了和归并排序一样的分而治之策略 它的思路是依据一个 基准值 数据项来把列表分为两部分 小于
  • lyapunov优化

    Lyapunov optimization是Michael J Neely发展起来的网络优化理论 可以参考 1 2 因为网络研究中缺乏理论 简单好使的算法 没有高大上的公式吓人 好像就不能发到高级别的期刊上 Lyapunov optimiz
  • 关系型数据库与非关系型数据库的区别

    文章目录 1 关系型数据库 1 1 概念 1 2 优点 1 3 瓶颈 2 从关系型到非关系型 3 非关系型数据库 3 1概念 3 2分类 3 3 缺点 4 对比 4 1 存储上 4 2 事务 4 3 数据集 4 4 结构 1 关系型数据库
  • Ubuntu安装时:downloading language packs

    ubuntu 安装时 问题 downloading language packs 如果网络不好 持续能达到几个小时 解决办法 切断网络连接 安装完后 还可以再安装
  • php模式之装饰器模式1

    原文来自 大胖博客 装饰器模式 也成修饰器模式 目的是给现有的对象增加或修改成新逻辑 说人话就是不改变对象的情况下 给对象的某个操作增加前置操作或者后置操作 当然也有可能改变操作的逻辑 举个栗子 我们在操作数据库的时候会从数据库拉取数据 拉
  • 《shell脚本编写——常用例子》

    目录 1 书写脚本 批量添加用户 2 根据要求判断文件类型 3 根据要求搜集服务器系统信息 4 检测磁盘使用率 5 检测url是否正常 6 防止文件被误删除的脚本 7 shell入侵检测和邮件报警 1 MD5sum校验 2 web目录下文件
  • 信号量和互斥锁有什么区别

    这是概念上的区别 比如说 信号 那是多线程同步用的 一个线程完成了某一个动作就通过信号告诉别的线程 别的线程再进行某些动作 互斥锁 这是多线程互斥用的 比如说 一个线程占用了某一个资源 那么别的线程就无法访问 知道这个线程离开 其他的线程才
  • vue自定义指令 v-debounce 防抖

    vue自定义指令 防抖 使用场景 点击查询按钮 或者 点击提交保存按钮 的时候点击次数过多 会多次提交 为了避免这种情况发生 我们可以做个防抖 点击一次后 第二次需要间隔一定的时间才能再次点击 这时候我们能想到可以用vue 的自定义指令di
  • UE4(Unreal Engine4)虚幻引擎视口布局,并且自定义HDRI

    UE4系列文章目录 文章目录 UE4系列文章目录 前言 一 操作步骤 1 准备工作 二 操作步骤 1 UE4中创建第三人称游戏 前言 在UE4中搭建电影级场景 先看下效果 一 操作步骤 1 准备工作 1 在UE4 Unreal Engine
  • nodejs全栈开发学习笔记

    为什么学nodejs 因为听说学会了nodejs可以做全栈开发 哈哈 我也是一个有野心的程序员 其实并没有 nodejs学了好几次 也放弃了好几次 主要原因就是感觉莫名其妙 自学 跟前端开发联系不上 光是环境搭建 Windows系统 就卡死