diff --git "a/\351\255\217\345\255\220\345\215\216/20240407-\346\242\263\347\220\206\346\200\273\347\273\223.md" "b/\351\255\217\345\255\220\345\215\216/20240407-\346\242\263\347\220\206\346\200\273\347\273\223.md" index 8dc59cf6d4689532187530b1e8019a8815dabf4c..62e598cd20a5b87d161bbcfa3b6733d0b973dc05 100644 --- "a/\351\255\217\345\255\220\345\215\216/20240407-\346\242\263\347\220\206\346\200\273\347\273\223.md" +++ "b/\351\255\217\345\255\220\345\215\216/20240407-\346\242\263\347\220\206\346\200\273\347\273\223.md" @@ -13,4 +13,74 @@ app.use(router); let port=3000; app.listen(port); console.log(`服务器运行地址如下:http://localhost:${port}`); -``` \ No newline at end of file +``` + + +### 一、request和response介绍 +request是代表HTTP请求信息的对象,response是代表HTTP响应信息的对象。 + +当浏览器发请求访问服务器中的某一个Servlet时,服务器将会调用Servlet中的service方法来处理请求。在调用service方法之前会创建出request和response对象。 + +其中request对象中封装了浏览器发送给服务器的请求信息(请求行、请求头、请求实体等),response对象中将会封装服务器要发送给浏览器的响应信息(状态行、响应头、响应实体),在service方法执行完后,服务器再将response中的数据取出,按照HTTP协议的格式发送给浏览器。 + +每次浏览器访问服务器,服务器在调用service方法处理请求之前都会创建request和response对象。(即,服务器每次处理请求都会创建request和response对象) + +在请求处理完,响应结束时,服务器会销毁request和response对象。 + +### 二、request对象 +#### (1) + 所谓的请求参数,就是浏览器发送给服务器的数据(不区分请求方式),例如:通过表单向服务器提交的用户名、密码等,或者在超链接后面通过问号提交的数据,都是请求参数。 response(res)则是服务器发送给浏览器的数据 +```js + http://localhost/day10_res/RequestDemo1?user=李四&like=篮球&like=足球 +``` +#### (2)request域对象所具备的三大特征: + - 生命周期: 在服务器调用Servlet程序的service方法之前,会创建代表请求的request对象,在请求处理完,响应结束时,会销毁request对象。 + + - 作用范围: 在一次请求范围内,都可以获取到同一个request对象。 + + - 主要功能: 和请求转发配合使用,从Servlet带数据到JSP(带数据到目的地) + + +原文链接:https://blog.csdn.net/qq1808814025/article/details/106199159 +### 三、asycn(ctx) +use用来注册一个中间件 +```js +app.use((ctx,next)=>{ +... +}) +``` +#### 一般我们将(ctx,next)=>{}包装成一个异步函数 + +async (ctx,next)=>{} + +可以发现这个use方法接收一个函数作为参数,这个函数又接收两个参数ctx、next, + + > 其中ctx是koa自己封装的一个上下文对象,这个对象你可以看做是原生http中req和res的集合。 + + > 而next和Express中的next一样,可以在注册的函数中调用用以执行下一个中间件。 + +其中ctx.request/response囊括ctx.req/res的所有属性,那么我们要怎么将原本req和res下的属性赋给koa自己创建的请求和响应对象呢?这么多属性,难道要一个一个for过去吗?显然这样操作太重了。解决方法看https://zhuanlan.zhihu.com/p/112356268 + + +#### 用法 +ctx,即context,大多数人称之为上下文对象。 + +这个对象下有4个主要的属性,它们分别是 + +· ctx.req:原生的req对象 + +· ctx.res:原生的res对象 + +· ctx.request:koa自己封装的request对象 + +· ctx.response:koa自己封装的response对象 + +其中koa自己封装的和原生的最大的区别在于,koa自己封装的请求和响应对象的内容不仅囊括原生的还有一些其独有的东东 + +... + +console.log(ctx.query); //原生中需要经过url.parse(p,true).query才能得到的query对象 + +console.log(ctx.path); //原生中需要经过url.parse(p).pathname才能得到的路径(url去除query部分) \ No newline at end of file diff --git "a/\351\255\217\345\255\220\345\215\216/20240408-sequelize\346\200\273\347\273\223.md" "b/\351\255\217\345\255\220\345\215\216/20240408-sequelize\346\200\273\347\273\223.md" new file mode 100644 index 0000000000000000000000000000000000000000..a94ed9312727ccba91b1de1c9cc2d55a6b655401 --- /dev/null +++ "b/\351\255\217\345\255\220\345\215\216/20240408-sequelize\346\200\273\347\273\223.md" @@ -0,0 +1,76 @@ +### 创建sequelize实例 +要连接到数据库,必须创建一个 Sequelize 实例. 这可以通过将连接参数分别传递到 Sequelize 构造函数来完成: +```js +const { Sequelize } = require('sequelize'); +// 分别传递参数 (sqlite数据库) +const sequelize = new Sequelize({ + dialect: 'sqlite', + storage: 'path/to/database.sqlite' + }); + +// 分别传递参数 (其它数据库) +const sequelize = new Sequelize('database', 'username', 'password', { + host: 'localhost', + dialect: /* 选择 'mysql' | 'mariadb' | 'postgres' | 'mssql' 其一 */ + ,logging: console.log, + }); +``` +在导入sequelize模块的时候,require 中的参数是表示 sequelize 模块,在导入sequelize模块之后,返回的是一个对象,通过{}结构对象,而 { Sequelize }则表示将对象中的 Sequelize 结构出来,Sequelize 是不可改变的。 + +以上两种方法都是用来sequelize实例,他们的区别是:第一种方式是创建sqlite数据库的实例,另外一种是创建除了sqlite数据库之外的实例。 + +在创建过程中,Sequelize 的构造函数中不止上述那些参数,上述参数只是必须参数。 + +### 创建模型 +在创建完 Sequelize 实例之后,我们需要对表进行创建。而模型是什么呢?模型是 Sequelize 的本质. 模型是代表数据库中表的抽象。 + +模型的创建有两种方式,一种是通过调用define()方法,还有一种是init()方法。接下来我们去了解一下这两种创建方式 + +使用sequelize.define +这种方式的具体语法格式是:sequelize.define(modelName, attributes, options)。这种方法需要三个参数,分别表示模型名称、定义列、模型的配置项。其中后两项是比较重要的参数,也是另外一种方式的参数。 + +modelName,表示模型的名称,如果没有给模型定义表名,则将使用模型名代替表名,且表名默认复数化。如果不想让表名复数化,可以使用 freezeTableName配置模型,具体见下关于 option 的内容。也可以使用 tableName 设置主动设置表名,具体见下关于 option 的内容 + +attributes,表示对表中字段的定义,它是一个对象。定义字段的属性有很多,接下来我们通过建立一个模型了解一下: +```js +const { DataTypes } = require('sequelize'); + +const Test = sequelize.define('tesst', { + //type表示列的类型,DataTypes是sequelize模块中自带的属性,表示数据类型 + //allowNull表示这个列是否能为空,false表示不能为空,默认值为true + //defaultValue表示列的默认值 + firstName: { + type: DataTypes.STRING, + allowNull: false, + defaultValue: "这个是默认值" + }, + //unique可以是布尔值或字符串。如果为布尔值则表示这个列是唯一键 + //如果是compositeIndex表示为 + lastName: { + type: DataTypes.STRING, + allowNull: true, + unique: true + }, + //primaryKey表示是否为主键,值为true时表示为主键 + third: { + type: DataTypes.INTEGER, + primaryKey: true + }, + //field:不使用对象名作为列名,而使用field的属性值 + //comment:这个是列的注释 + fourth: { + type: DataTypes.INTEGER, + field: "four_th", + comment: '这是带有注释的列' + }, +}); + +``` +### 部分属性 +reezeTableName :为true时,且当模型名就是表名时,表名不复数化 +tableName: 设置表名 +timestamps: 在默认情况下,创建模型时会自动给模型添加 createdAt 和 updatedAt 字段,分别表示创建表的时间戳、修改表的时间戳。默认值为true。 +createdAt:默认为true,如果值为字符串则表示使用createdAt,且给模型添加的是字符串的值 +updatedAt:同上 + +原文链接:https://blog.csdn.net/qq_45040919/article/details/110200096 \ No newline at end of file diff --git "a/\351\255\217\345\255\220\345\215\216/20240409.md" "b/\351\255\217\345\255\220\345\215\216/20240409.md" new file mode 100644 index 0000000000000000000000000000000000000000..d96656a87f98836c343d18f7b6a28c70f61310c2 --- /dev/null +++ "b/\351\255\217\345\255\220\345\215\216/20240409.md" @@ -0,0 +1,19 @@ +异步编程:Node.js 采用异步非阻塞的 I/O 模型,因此应尽可能地利用异步编程,避免阻塞调用。使用回调函数、Promise、async/await 等方式处理异步操作,以充分利用事件循环机制。 + +代码优化:优化 JavaScript 代码可以显著提升 Node.js 应用程序的性能。避免不必要的循环、条件判断和递归调用,尽量减少内存占用和 CPU 开销。 + +模块缓存:Node.js 会将已加载的模块缓存起来,以提高性能。因此,在可能的情况下,尽量重用已加载的模块,避免重复加载和解析。 + +事件循环优化:了解事件循环的工作原理,合理利用事件驱动的特性,避免在事件循环中阻塞过长的操作,以确保应用程序的响应性和吞吐量。 + +内存管理:避免内存泄漏是提升 Node.js 性能的关键。定期检查和优化内存使用,使用内存管理工具(如内存分析器)来识别和解决潜在的内存泄漏问题。 + +并发限制:合理设置并发限制,以防止过多的并发连接对系统造成压力。可以使用各种限流和负载均衡技术来管理并发请求。 + +资源压缩和缓存:对静态资源进行压缩和缓存,减少网络传输时间和带宽消耗。利用 CDN(内容分发网络)来加速静态资源的传输。 + +数据库优化:合理设计数据库结构,优化查询语句和索引,减少数据库操作的次数和时间。采用连接池技术来管理数据库连接,提高数据库访问的效率。 + +使用性能分析工具:借助性能分析工具(如Node.js 的内置工具、第三方工具、监控服务等),对应用程序进行性能分析和监控,及时发现和解决性能瓶颈。 + +水平扩展:当单机性能无法满足需求时,考虑采用水平扩展的方式,通过增加节点来分散负载,提高系统的整体性能和可扩展性 \ No newline at end of file diff --git "a/\351\255\217\345\255\220\345\215\216/\347\273\203\344\271\240/nmp.text" "b/\351\255\217\345\255\220\345\215\216/\347\273\203\344\271\240/nmp.text" new file mode 100644 index 0000000000000000000000000000000000000000..dca1f72369a582638390a367d5471871bff0233a --- /dev/null +++ "b/\351\255\217\345\255\220\345\215\216/\347\273\203\344\271\240/nmp.text" @@ -0,0 +1 @@ +会 \ No newline at end of file