express.js研究

 ✒️ @halomaster 📅 27 Jul 2022, 08:05 GMT⋮ 【前端开发】 

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