Browse Source

Fix shallow copy of cached object

pull/6/head
Menci 6 years ago
parent
commit
12e1735c76
  1. 22
      models/common.ts
  2. 1
      package.json
  3. 12
      yarn.lock

22
models/common.ts

@ -1,6 +1,6 @@
import * as TypeORM from "typeorm"; import * as TypeORM from "typeorm";
import * as LRUCache from "lru-cache"; import * as LRUCache from "lru-cache";
import * as ObjectAssignDeep from "object-assign-deep"; import * as DeepCopy from "deepcopy";
interface Paginater { interface Paginater {
pageCnt: number; pageCnt: number;
@ -41,27 +41,27 @@ export default class Model extends TypeORM.BaseEntity {
if ((this as typeof Model).cache) { if ((this as typeof Model).cache) {
let result; let result;
if (result = cacheGet(this.name, id)) { if (result = cacheGet(this.name, id)) {
// Got cached result. return result.clone();
// Return a copy of it to avoid issue of adding or assigning properties.
const object = {};
Object.keys(result).forEach(key => {
object[key] = result[key] && typeof result[key] === 'object'
? ObjectAssignDeep({}, result[key])
: result[key];
});
return (this as typeof Model).create<T>(object);
} }
result = await doQuery(); result = await doQuery();
if (result) { if (result) {
cacheSet(this.name, id, result); cacheSet(this.name, id, result);
} }
return result; return result.clone();
} else { } else {
return await doQuery(); return await doQuery();
} }
} }
clone() {
const object = {};
TypeORM.getConnection().getMetadata(this.constructor).ownColumns.map(column => column.propertyName).forEach(key => {
object[key] = DeepCopy(this[key]);
});
return (this.constructor as any).create(object);
}
async destroy() { async destroy() {
const id = (this as any).id; const id = (this as any).id;
await TypeORM.getManager().remove(this); await TypeORM.getManager().remove(this);

1
package.json

@ -34,6 +34,7 @@
"command-line-args": "^5.1.0", "command-line-args": "^5.1.0",
"cookie-parser": "^1.4.4", "cookie-parser": "^1.4.4",
"cssfilter": "0.0.10", "cssfilter": "0.0.10",
"deepcopy": "^2.0.0",
"download": "^7.1.0", "download": "^7.1.0",
"ejs": "^2.5.2", "ejs": "^2.5.2",
"express": "^4.14.0", "express": "^4.14.0",

12
yarn.lock

@ -859,6 +859,13 @@ deep-is@~0.1.3:
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
deepcopy@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/deepcopy/-/deepcopy-2.0.0.tgz#2acb9b7645f9f54d815eee991455e790e72e2252"
integrity sha512-d5ZK7pJw7F3k6M5vqDjGiiUS9xliIyWkdzBjnPhnSeRGjkYOGZMCFkdKVwV/WiHOe0NwzB8q+iDo7afvSf0arA==
dependencies:
type-detect "^4.0.8"
delayed-stream@~1.0.0: delayed-stream@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
@ -3525,6 +3532,11 @@ type-check@~0.3.2:
dependencies: dependencies:
prelude-ls "~1.1.2" prelude-ls "~1.1.2"
type-detect@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
type-is@^1.6.4, type-is@~1.6.16: type-is@^1.6.4, type-is@~1.6.16:
version "1.6.16" version "1.6.16"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"

Loading…
Cancel
Save