Node.js+Express+Koa2+Nest.js 开发服务端学习笔记

389 阅读4分钟

nodejs:node是让js代码可以运行在操作系统上或者服务器上面的运行环境,拥有了操作系统级别的api,同时也继承了js本身的特性,事件驱动、闭包等

第3章 nodejs 介绍

debuger之inspect协议

image.png

image.png

  1. packages.json的命令行中增加--inspect=9229
  2. 代码逻辑中写入debugger
  3. 网页打开chrome://inspect
  4. 前端网页通过路由的方式,触发debugger
第5章 开发博客项目之接口
tip1: 模块化规范

NodeJs默认用CommonJs规范来解析.js文件,用ES Modules来解析.mjs文件,如果我们将index.mjs强行改成index.js,那么在用node index.js来执行文件时,就会因为代码内容不符合相应的语法规范而报错; package.json中增加"type": "module",这样就可以用node来执行用ES Module规范来写的.js文件

tip2: 文件引入

app.js,js后缀不能省略,如何配置

import {serverHandle} from '../app.js'
tip3:回调地狱&promise (开发路由(博客详情路由)(下))

第6章 开发博客项目之数据存储

mysql:用docker安装 客户端:dbeaver

  • sql注释用--
  • password是关键字,所以用``(insert的时候需要,select的时候不需要)
use myblog;

-- show tables;
-- insert into users(username,`password`,realname)values('lisi','123','李四');
-- select * from users;
-- select id,username from users;
-- select * from users where username='zhangsan'or`password`='123'

-- 模糊查询
select * from users where username like '%zhang%'

我这里用Docker拉取mysql的镜像,然后创建了容器;数据库的客户端使用的dbeaver,本地node连接的时候,主要是两个问题

  • mysql 8的加密方式引起报错
  • docker 需要登录容器内部,进行授权

image.png

image.png

## 进入容器内,登录mysql
mysql -u root -p

## 创建用户
## host一定要是'%' 
## mysql_native_password 一定要用这个加密方式
mysql> CREATE USER 'xcy'@'%' IDENTIFIED WITH mysql_native_password BY 'xxxx';

## 授权
mysql> GRANT ALL PRIVILEGES ON *.* TO 'xcy'@'%' WITH GRANT OPTION;

## 刷新
mysql> FLUSH PRIVILEGES;
**

另外,因为使用的dbeaver,所以还会遇到Public Key Retrieval is not allowed报错

参考:blog.csdn.net/qq_33642970… image.png

参考:

第7章 博客项目之登录

image.png

image.png

一. 客户端JavaScript操作cookie

1. 客户端查看cookie三种方式

  • 请求头中有cookie 响应头中有set-cookie
  • chrome/application/cookie
  • 控制台document.cookie

2. js查看、修改cookie(有限制)

  • 控制台 document.cookie = 'k1=100'(会被累加)

二. server端nodejs操作cookie

image.png 加了httpOnly后,该cookie无法通过document.cookie查看和修改

image.png document.cookie="name=1121"会修改cookie中name的值,但是document.cookie="username=111"就不会修改cookie中username的值

三. session

cookie中存放username很危险,所以cookie中存放userid,server端获取userid去对应用户的信息,这种方案叫做session

四. redis

session保存在内存的进程中,线上多进程的情况,无法共享,且大小受限,所以存在redis中

image.png

image.png

image.png

目前工作中,nodejs主要做bfe层,不与数据库直接操作,所以这里了解一下就好,以后有需要的时候再看一下

五. 跨域

方法一. nginx做转发

方法二. 前端配置代理(本地开发)

方法三. CORS

server:
  // cors
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:5173');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
    res.setHeader('Access-Control-Allow-Credentials', true);
    
fe:
axios.post('http://localhost:8000/api/user/login', {
        username: 'lisi',
        password: '123',
    })
    .then(response => {
        console.log(response.data);
    })
    .catch(error => {
        console.error(error);
    });

image.png

第8章 博客项目之日志

后续补充

第9章 博客项目之安全

后续补充

第10章 使用 express 重构博客项目

res.json({
        error: 0,
        data: {
            "id": 2,
            "name": "test---2",
        }
    })
 相当于原生的
 res.end(JSON.stringify())
 res.setHeader('Content-Type', 'application/json')
第11章 使用 Koa2 重构博客项目

image.png

image.png

## 安装koa2
$ npm install koa-generator -g
$ Koa2 koa2-test
$ npm i & npm run dev

洋葱圈模型

image.png 先红色,后黄色

第14章 线上环境和 PM2 配置

image.png 单个进程的内存是有限的,使用多个进程的时候,session存放在内存中是不能共享的,所以需要把session存放在redis中

第15章 发布到云服务器

image.png

其他:
  1. cross-env

image.png 4. application/json和text/html区别

  1. res.end和res.write区别
// res.writeHead(404, { 'Content-Type': 'text/plain' })
    // res.write('404 Not Found\n')
    res.end('404 Not Found\n')
  1. super