express框架非常简洁,而且从用了微内核架构,扩展性极强;
可以说,express就是有 URL路由和一堆中间件组成的;
express社区非常活跃,代码仓库更新的速度极快。
[1] @halomaster • 27 Jul 2022, 08:05 GMT
express-session的基本使用
https://blog.csdn.net/void_fan/article/details/110679200?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-110679200-blog-108430593.pc_relevant_multi_platform_whitelistv3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-110679200-blog-108430593.pc_relevant_multi_platform_whitelistv3&utm_relevant_index=1
[2] @halomaster • 27 Jul 2022, 08:12 GMT
rolling: false 可以关闭cookie自动延期,可以提高性能,减少服务器写session表操作。
[3] @halomaster • 27 Jul 2022, 08:25 GMT
session存sqlite可能有点慢,而且不好多进程/多机器部署。
所以还是切换到mongodb比较好。
`connect-mongo`是一个连接mongo的组件。
[4] @halomaster • 27 Jul 2022, 08:27 GMT
``` bash
yarn add connect-mongo
```
即可添加该组件到项目。
[5] @halomaster • 27 Jul 2022, 08:51 GMT
如果提示 缺少 mongodb等库,可以
`yarn add xxxxxx`
安装一下即可。
[6] @halomaster • 27 Jul 2022, 08:55 GMT
参考链接: https://github.com/jdesboeufs/connect-mongo#options
[7] @halomaster • 27 Jul 2022, 08:59 GMT
核心代码:
``` js
const MongoStore = require('connect-mongo');
const options= {
mongoUrl: 'mongodb://127.0.0.1:27017/store',
//不管发出多少请求,在24小时内只更新一次session,除非改变了session
touchAfter: 24 * 3600,
}
module.exports = session({
secret: config.sessionSecret,
resave: false,
saveUninitialized: true,
// store: sessionStore,
store: MongoStore.create(options),
cookie: {
// secure: true // requires HTTPS connection
},
rolling: false
});
```
需要注意的是有一些文档里写法过于老旧是跑不起来的。特别需要吧 options.mongoUrl 配置对。
[8] @halomaster • 27 Jul 2022, 09:03 GMT
修改session存储后,从后台已经看不到每次页面访问都会有sqlite update的sql了。
页面响应速度获得了显著的提升。
[9] @halomaster • 28 Jul 2022, 12:46 GMT
不同系统同步文件夹的时候,可能导致 部分node模块由于有本地代码,不能执行,提示ELF文件格式错误等。
`npm un xxxxx`
再 `yarn add xxxxx`
即可。
[10] @halomaster • 02 Aug 2022, 06:41 GMT
https://www.shuzhiduo.com/A/D854D7pW5E/
[11] @halomaster • 08 Aug 2022, 03:16 GMT
https://github.com/DanielHreben/sequelize-transparent-cache sequelize的透明缓存插件
[12] @halomaster • 08 Aug 2022, 16:32 GMT
https://github.com/DanielHreben/sequelize-transparent-cache 透明是最最大的特点,可以极大的降低cache的倾入性。
[13] @halomaster • 10 Aug 2022, 03:35 GMT
删除post的时候遇到 级联删除 失败的问题:
``` bash
Executing (default): DELETE FROM `Posts` WHERE `id` = 41
ForeignKeyConstraintError [SequelizeForeignKeyConstraintError]: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed
at Query.formatError (/root/jss/litebb/node_modules/sequelize/lib/dialects/sqlite/query.js:373:18)
at Query._handleQueryResponse (/root/jss/litebb/node_modules/sequelize/lib/dialects/sqlite/query.js:73:18)
at Statement.afterExecute (/root/jss/litebb/node_modules/sequelize/lib/dialects/sqlite/query.js:250:31)
at Statement.replacement (/root/jss/litebb/node_modules/sqlite3/lib/trace.js:25:27)
From previous event:
at executeSql (/root/jss/litebb/node_modules/sequelize/lib/dialects/sqlite/query.js:242:19)
From previous event:
at model.destroy (/root/jss/litebb/node_modules/sequelize/lib/model.js:4205:8)
at deletePost (/root/jss/litebb/controllers/post.controller.js:254:16) {
parent: Error: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed
--> in Database#all('DELETE FROM `Posts` WHERE `id` = 41', [], [Function: afterExecute])
at /root/jss/litebb/node_modules/sequelize/lib/dialects/sqlite/query.js:262:27
at Promise._execute (/root/jss/litebb/node_modules/bluebird/js/release/debuggability.js:384:9)
at Promise._resolveFromExecutor (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:518:18)
at new Promise (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:103:10)
at executeSql (/root/jss/litebb/node_modules/sequelize/lib/dialects/sqlite/query.js:242:19)
at tryCatcher (/root/jss/litebb/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:547:31)
at Promise._settlePromise (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:604:18)
at Promise._settlePromise0 (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:649:10)
at Promise._settlePromises (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:729:18)
at Promise._fulfill (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:673:18)
at MappingPromiseArray.PromiseArray._resolve (/root/jss/litebb/node_modules/bluebird/js/release/promise_array.js:127:19)
at MappingPromiseArray._promiseFulfilled (/root/jss/litebb/node_modules/bluebird/js/release/map.js:108:18)
at Promise._settlePromise (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:609:26)
at Promise._settlePromise0 (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:649:10)
at Promise._settlePromises (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:729:18)
at _drainQueueStep (/root/jss/litebb/node_modules/bluebird/js/release/async.js:93:12)
at _drainQueue (/root/jss/litebb/node_modules/bluebird/js/release/async.js:86:9)
at Async._drainQueues (/root/jss/litebb/node_modules/bluebird/js/release/async.js:102:5)
at Immediate.Async.drainQueues (/root/jss/litebb/node_modules/bluebird/js/release/async.js:15:14)
at processImmediate (internal/timers.js:461:21) {
errno: 19,
code: 'SQLITE_CONSTRAINT',
__augmented: true,
sql: 'DELETE FROM `Posts` WHERE `id` = 41'
},
original: Error: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed
--> in Database#all('DELETE FROM `Posts` WHERE `id` = 41', [], [Function: afterExecute])
at /root/jss/litebb/node_modules/sequelize/lib/dialects/sqlite/query.js:262:27
at Promise._execute (/root/jss/litebb/node_modules/bluebird/js/release/debuggability.js:384:9)
at Promise._resolveFromExecutor (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:518:18)
at new Promise (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:103:10)
at executeSql (/root/jss/litebb/node_modules/sequelize/lib/dialects/sqlite/query.js:242:19)
at tryCatcher (/root/jss/litebb/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:547:31)
at Promise._settlePromise (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:604:18)
at Promise._settlePromise0 (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:649:10)
at Promise._settlePromises (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:729:18)
at Promise._fulfill (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:673:18)
at MappingPromiseArray.PromiseArray._resolve (/root/jss/litebb/node_modules/bluebird/js/release/promise_array.js:127:19)
at MappingPromiseArray._promiseFulfilled (/root/jss/litebb/node_modules/bluebird/js/release/map.js:108:18)
at Promise._settlePromise (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:609:26)
at Promise._settlePromise0 (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:649:10)
at Promise._settlePromises (/root/jss/litebb/node_modules/bluebird/js/release/promise.js:729:18)
at _drainQueueStep (/root/jss/litebb/node_modules/bluebird/js/release/async.js:93:12)
at _drainQueue (/root/jss/litebb/node_modules/bluebird/js/release/async.js:86:9)
at Async._drainQueues (/root/jss/litebb/node_modules/bluebird/js/release/async.js:102:5)
at Immediate.Async.drainQueues (/root/jss/litebb/node_modules/bluebird/js/release/async.js:15:14)
at processImmediate (internal/timers.js:461:21) {
errno: 19,
code: 'SQLITE_CONSTRAINT',
__augmented: true,
sql: 'DELETE FROM `Posts` WHERE `id` = 41'
},
sql: 'DELETE FROM `Posts` WHERE `id` = 41',
parameters: undefined,
fields: undefined,
table: undefined,
value: undefined,
index: undefined,
reltype: undefined
}
POST /p/41/delete 500 170.585 ms - 5368
```
修正方法
增加relay的模型定义中 onDelete和hooks的配置:
``` javascript
Reply.associate = function (models) {
models.Post.hasMany(models.Reply, {
sourceKey: 'id', onDelete: 'cascade', hooks: true
});
};
```
[14] @halomaster • 10 Aug 2022, 05:55 GMT
Sequelize 简介
=====
https://www.sequelize.com.cn
[15] @halomaster • 10 Aug 2022, 19:09 GMT
git@github.com:neroneroffy/webSocketDemo.git
一个Express和websocket整合的例子。
[16] @halomaster • 11 Aug 2022, 15:58 GMT
Sequelize 更新model的字段的时候,一定要先从数据库中 find出制定的字段。
由于JS的动态特性,如果直接是赋值 需要更新的字段,而没有在前面的findOne阶段读出指定字段,那么就不会触发Sequelize生成指定的字段的update语句。
[17] @halomaster • 14 Aug 2022, 05:30 GMT
现在增加了 sequelize-transparent-cache。
初步使用下来,页面打开的速度大大提升了。
[18] @halomaster • 14 Aug 2022, 06:52 GMT
[【彻底弄懂浏览器缓存策略】](https://bjun.tech/blog/xphp/72)
[19] @halomaster • 16 Aug 2022, 02:44 GMT
Sequelize创建联合索引的方法:
``` bash
npx sequelize-cli model:generate --name Graph --attributes fromNode:string,fromNodeType:string,toNode:string,toNodeType:string,edgeID:string,edgeType:string,edgeData:string
```
新建一个model操作,自动生成迁移脚本xxx-create-graph.js。
编辑这个脚本,在 创建表语句后衔接:
``` javascript
.then(()=>{
queryInterface.addIndex(
'Graphs', ['fromNode', 'toNode', 'edgeType'], {name: 'unique_from_to_edgetype', type: 'unique'}
)
})
```
在down:里添加:
``` javascript
queryInterface.removeIndex('Graphs', 'unique_from_to_edgetype');
```
执行:
``` bash
npx sequelize-cli db:migrate
```
如果提示:
``` bash
Sequelize CLI [Node: 12.22.9, CLI: 5.5.1, ORM: 5.22.5]
Loaded configuration file "config/app.js".
Using environment "development".
== 20220816020942-create-graph: migrating =======
== 20220816020942-create-graph: migrated (0.032s)
```
OK,检查下数据库中,索引是否存在即可。
1 of 1 pages 19 replies