@nocobase/plugin-error-handler 0.11.1-alpha.5 → 0.12.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client.d.ts +2 -3
- package/client.js +1 -1
- package/dist/client/index.js +11 -0
- package/{lib → dist}/index.d.ts +1 -0
- package/dist/index.js +18 -0
- package/dist/locale/en_US.js +10 -0
- package/dist/locale/es-ES.js +10 -0
- package/dist/locale/fr_FR.js +10 -0
- package/dist/locale/ja_JP.js +8 -0
- package/dist/locale/pt-BR.js +10 -0
- package/dist/locale/zh_CN.js +9 -0
- package/{src/server/error-handler.ts → dist/server/error-handler.js} +10 -12
- package/dist/server/index.js +7 -0
- package/dist/server/locale/en_US.js +10 -0
- package/dist/server/locale/es-ES.js +10 -0
- package/dist/server/locale/fr_FR.js +10 -0
- package/dist/server/locale/ja_JP.js +8 -0
- package/dist/server/locale/pt-BR.js +10 -0
- package/dist/server/locale/zh_CN.js +9 -0
- package/dist/server/server.js +62 -0
- package/package.json +14 -23
- package/server.d.ts +2 -3
- package/server.js +1 -1
- package/lib/client/index.js +0 -22
- package/lib/index.js +0 -13
- package/lib/locale/en_US.js +0 -13
- package/lib/locale/es-ES.js +0 -13
- package/lib/locale/fr_FR.js +0 -13
- package/lib/locale/ja_JP.js +0 -11
- package/lib/locale/pt-BR.js +0 -13
- package/lib/locale/zh_CN.js +0 -12
- package/lib/server/error-handler.js +0 -66
- package/lib/server/index.js +0 -12
- package/lib/server/locale/en_US.js +0 -13
- package/lib/server/locale/es-ES.js +0 -13
- package/lib/server/locale/fr_FR.js +0 -13
- package/lib/server/locale/ja_JP.js +0 -11
- package/lib/server/locale/pt-BR.js +0 -13
- package/lib/server/locale/zh_CN.js +0 -12
- package/lib/server/server.js +0 -93
- package/src/client/index.ts +0 -7
- package/src/index.ts +0 -1
- package/src/locale/en_US.ts +0 -6
- package/src/locale/es-ES.ts +0 -6
- package/src/locale/fr_FR.ts +0 -6
- package/src/locale/ja_JP.ts +0 -4
- package/src/locale/pt-BR.ts +0 -6
- package/src/locale/zh_CN.ts +0 -5
- package/src/server/__tests__/render-error.test.ts +0 -172
- package/src/server/index.ts +0 -1
- package/src/server/locale/en_US.ts +0 -6
- package/src/server/locale/es-ES.ts +0 -6
- package/src/server/locale/fr_FR.ts +0 -6
- package/src/server/locale/ja_JP.ts +0 -4
- package/src/server/locale/pt-BR.ts +0 -6
- package/src/server/locale/zh_CN.ts +0 -5
- package/src/server/server.ts +0 -54
- /package/{lib → dist}/client/index.d.ts +0 -0
- /package/{lib → dist}/locale/en_US.d.ts +0 -0
- /package/{lib → dist}/locale/es-ES.d.ts +0 -0
- /package/{lib → dist}/locale/fr_FR.d.ts +0 -0
- /package/{lib → dist}/locale/ja_JP.d.ts +0 -0
- /package/{lib → dist}/locale/pt-BR.d.ts +0 -0
- /package/{lib → dist}/locale/zh_CN.d.ts +0 -0
- /package/{lib → dist}/server/error-handler.d.ts +0 -0
- /package/{lib → dist}/server/index.d.ts +0 -0
- /package/{lib → dist}/server/locale/en_US.d.ts +0 -0
- /package/{lib → dist}/server/locale/es-ES.d.ts +0 -0
- /package/{lib → dist}/server/locale/fr_FR.d.ts +0 -0
- /package/{lib → dist}/server/locale/ja_JP.d.ts +0 -0
- /package/{lib → dist}/server/locale/pt-BR.d.ts +0 -0
- /package/{lib → dist}/server/locale/zh_CN.d.ts +0 -0
- /package/{lib → dist}/server/server.d.ts +0 -0
package/client.d.ts
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export { default } from './
|
|
3
|
-
|
|
1
|
+
export * from './dist/client';
|
|
2
|
+
export { default } from './dist/client';
|
package/client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
module.exports = require('./
|
|
1
|
+
module.exports = require('./dist/client/index.js');
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
(function(global, factory) {
|
|
2
|
+
typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("@nocobase/client")) : typeof define === "function" && define.amd ? define(["exports", "@nocobase/client"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global["@nocobase/plugin-error-handler"] = {}, global["@nocobase/client"]));
|
|
3
|
+
})(this, function(exports2, client) {
|
|
4
|
+
"use strict";
|
|
5
|
+
class ErrorHandlerPlugin extends client.Plugin {
|
|
6
|
+
async load() {
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
exports2.default = ErrorHandlerPlugin;
|
|
10
|
+
Object.defineProperties(exports2, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
11
|
+
});
|
package/{lib → dist}/index.d.ts
RENAMED
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var server = require('./server');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
Object.defineProperty(exports, 'default', {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: function () { return server__namespace.default; }
|
|
12
|
+
});
|
|
13
|
+
Object.keys(server).forEach(function (k) {
|
|
14
|
+
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return server[k]; }
|
|
17
|
+
});
|
|
18
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var en_US_default = {
|
|
4
|
+
"unique violation": "{{field}} must be unique",
|
|
5
|
+
"notNull violation": "notNull violation",
|
|
6
|
+
"Validation error": "{{field}} validation error",
|
|
7
|
+
"notNull Violation": "{{field}} cannot be null"
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
module.exports = en_US_default;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var es_ES_default = {
|
|
4
|
+
"unique violation": "{{field}} debe ser \xFAnico",
|
|
5
|
+
"notNull violation": "notNull violaci\xF3n",
|
|
6
|
+
"Validation error": "{{field}} error de validaci\xF3n",
|
|
7
|
+
"notNull Violation": "{{field}} no puede ser null"
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
module.exports = es_ES_default;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fr_FR_default = {
|
|
4
|
+
"unique violation": "{{field}} doit \xEAtre unique",
|
|
5
|
+
"notNull violation": "Violation de contrainte notNull",
|
|
6
|
+
"Validation error": "Erreur de validation de {{field}}",
|
|
7
|
+
"notNull Violation": "{{field}} ne peut pas \xEAtre null"
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
module.exports = fr_FR_default;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var ja_JP_default = {
|
|
4
|
+
"unique violation": "{{field}} \u306F\u4E00\u610F\u3067\u306A\u304F\u3066\u306F\u306A\u308A\u307E\u305B\u3093",
|
|
5
|
+
"notNull Violation": "{{field}} \u306FNull\u306B\u3067\u304D\u307E\u305B\u3093"
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
module.exports = ja_JP_default;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var pt_BR_default = {
|
|
4
|
+
"unique violation": "{{field}} deve ser \xFAnico",
|
|
5
|
+
"notNull violation": "viola\xE7\xE3o de n\xE3o nulo",
|
|
6
|
+
"Validation error": "erro de valida\xE7\xE3o de {{field}}",
|
|
7
|
+
"notNull Violation": "{{field}} n\xE3o pode ser nulo"
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
module.exports = pt_BR_default;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var zh_CN_default = {
|
|
4
|
+
"unique violation": "{{field}} \u5B57\u6BB5\u503C\u662F\u552F\u4E00\u7684",
|
|
5
|
+
"notNull violation": "{{field}} \u5B57\u6BB5\u4E0D\u80FD\u4E3A\u7A7A",
|
|
6
|
+
"Validation error": "{{field}} \u5B57\u6BB5\u89C4\u5219\u9A8C\u8BC1\u5931\u8D25"
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
module.exports = zh_CN_default;
|
|
@@ -1,29 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
handlers = [];
|
|
1
|
+
'use strict';
|
|
3
2
|
|
|
4
|
-
|
|
3
|
+
class ErrorHandler {
|
|
4
|
+
handlers = [];
|
|
5
|
+
register(guard, render) {
|
|
5
6
|
this.handlers.push({
|
|
6
7
|
guard,
|
|
7
|
-
render
|
|
8
|
+
render
|
|
8
9
|
});
|
|
9
10
|
}
|
|
10
|
-
|
|
11
11
|
defaultHandler(err, ctx) {
|
|
12
12
|
ctx.status = err.statusCode || err.status || 500;
|
|
13
13
|
ctx.body = {
|
|
14
14
|
errors: [
|
|
15
15
|
{
|
|
16
16
|
message: err.message,
|
|
17
|
-
code: err.code
|
|
18
|
-
}
|
|
19
|
-
]
|
|
17
|
+
code: err.code
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
20
|
};
|
|
21
|
-
|
|
22
21
|
if (ctx.status === 500) {
|
|
23
22
|
console.error(err);
|
|
24
23
|
}
|
|
25
24
|
}
|
|
26
|
-
|
|
27
25
|
middleware() {
|
|
28
26
|
const self = this;
|
|
29
27
|
return async function errorHandler(ctx, next) {
|
|
@@ -31,15 +29,15 @@ export class ErrorHandler {
|
|
|
31
29
|
await next();
|
|
32
30
|
} catch (err) {
|
|
33
31
|
ctx.log.error(err);
|
|
34
|
-
|
|
35
32
|
for (const handler of self.handlers) {
|
|
36
33
|
if (handler.guard(err)) {
|
|
37
34
|
return handler.render(err, ctx);
|
|
38
35
|
}
|
|
39
36
|
}
|
|
40
|
-
|
|
41
37
|
self.defaultHandler(err, ctx);
|
|
42
38
|
}
|
|
43
39
|
};
|
|
44
40
|
}
|
|
45
41
|
}
|
|
42
|
+
|
|
43
|
+
exports.ErrorHandler = ErrorHandler;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var en_US_default = {
|
|
4
|
+
"unique violation": "{{field}} must be unique",
|
|
5
|
+
"notNull violation": "notNull violation",
|
|
6
|
+
"Validation error": "{{field}} validation error",
|
|
7
|
+
"notNull Violation": "{{field}} cannot be null"
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
module.exports = en_US_default;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var es_ES_default = {
|
|
4
|
+
"unique violation": "{{field}} debe ser \xFAnico",
|
|
5
|
+
"notNull violation": "notNull violaci\xF3n",
|
|
6
|
+
"Validation error": "{{field}} error de validaci\xF3n",
|
|
7
|
+
"notNull Violation": "{{field}} no puede ser null"
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
module.exports = es_ES_default;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fr_FR_default = {
|
|
4
|
+
"unique violation": "{{field}} doit \xEAtre unique",
|
|
5
|
+
"notNull violation": "Violation de contrainte notNull",
|
|
6
|
+
"Validation error": "Erreur de validation de {{field}}",
|
|
7
|
+
"notNull Violation": "{{field}} ne peut pas \xEAtre null"
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
module.exports = fr_FR_default;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var ja_JP_default = {
|
|
4
|
+
"unique violation": "{{field}} \u306F\u4E00\u610F\u3067\u306A\u304F\u3066\u306F\u306A\u308A\u307E\u305B\u3093",
|
|
5
|
+
"notNull Violation": "{{field}} \u306FNull\u306B\u3067\u304D\u307E\u305B\u3093"
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
module.exports = ja_JP_default;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var pt_BR_default = {
|
|
4
|
+
"unique violation": "{{field}} deve ser \xFAnico",
|
|
5
|
+
"notNull violation": "viola\xE7\xE3o de n\xE3o nulo",
|
|
6
|
+
"Validation error": "erro de valida\xE7\xE3o de {{field}}",
|
|
7
|
+
"notNull Violation": "{{field}} n\xE3o pode ser nulo"
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
module.exports = pt_BR_default;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var zh_CN_default = {
|
|
4
|
+
"unique violation": "{{field}} \u5B57\u6BB5\u503C\u662F\u552F\u4E00\u7684",
|
|
5
|
+
"notNull violation": "{{field}} \u5B57\u6BB5\u4E0D\u80FD\u4E3A\u7A7A",
|
|
6
|
+
"Validation error": "{{field}} \u5B57\u6BB5\u89C4\u5219\u9A8C\u8BC1\u5931\u8D25"
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
module.exports = zh_CN_default;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsonSchema = require('@formily/json-schema');
|
|
4
|
+
var database = require('@nocobase/database');
|
|
5
|
+
var server = require('@nocobase/server');
|
|
6
|
+
var lodash = require('lodash');
|
|
7
|
+
var errorHandler = require('./error-handler');
|
|
8
|
+
var enUS = require('./locale/en_US');
|
|
9
|
+
var zhCN = require('./locale/zh_CN');
|
|
10
|
+
|
|
11
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
|
|
13
|
+
var lodash__default = /*#__PURE__*/_interopDefault(lodash);
|
|
14
|
+
var enUS__default = /*#__PURE__*/_interopDefault(enUS);
|
|
15
|
+
var zhCN__default = /*#__PURE__*/_interopDefault(zhCN);
|
|
16
|
+
|
|
17
|
+
class PluginErrorHandler extends server.Plugin {
|
|
18
|
+
errorHandler = new errorHandler.ErrorHandler();
|
|
19
|
+
i18nNs = "error-handler";
|
|
20
|
+
beforeLoad() {
|
|
21
|
+
this.registerSequelizeValidationErrorHandler();
|
|
22
|
+
}
|
|
23
|
+
registerSequelizeValidationErrorHandler() {
|
|
24
|
+
const findFieldTitle = (instance, path, tFunc) => {
|
|
25
|
+
if (!instance) {
|
|
26
|
+
return path;
|
|
27
|
+
}
|
|
28
|
+
const model = instance.constructor;
|
|
29
|
+
const collection = this.db.modelCollection.get(model);
|
|
30
|
+
const field = collection.getField(path);
|
|
31
|
+
const fieldOptions = jsonSchema.Schema.compile(field == null ? void 0 : field.options, { t: tFunc });
|
|
32
|
+
const title = lodash__default.default.get(fieldOptions, "uiSchema.title", path);
|
|
33
|
+
return title;
|
|
34
|
+
};
|
|
35
|
+
this.errorHandler.register(
|
|
36
|
+
(err) => {
|
|
37
|
+
var _a;
|
|
38
|
+
return ((_a = err == null ? void 0 : err.errors) == null ? void 0 : _a.length) && err instanceof database.BaseError;
|
|
39
|
+
},
|
|
40
|
+
(err, ctx) => {
|
|
41
|
+
ctx.body = {
|
|
42
|
+
errors: err.errors.map((err2) => {
|
|
43
|
+
return {
|
|
44
|
+
message: ctx.i18n.t(err2.type, {
|
|
45
|
+
ns: this.i18nNs,
|
|
46
|
+
field: findFieldTitle(err2.instance, err2.path, ctx.i18n.t)
|
|
47
|
+
})
|
|
48
|
+
};
|
|
49
|
+
})
|
|
50
|
+
};
|
|
51
|
+
ctx.status = 400;
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
async load() {
|
|
56
|
+
this.app.i18n.addResources("zh-CN", this.i18nNs, zhCN__default.default);
|
|
57
|
+
this.app.i18n.addResources("en-US", this.i18nNs, enUS__default.default);
|
|
58
|
+
this.app.use(this.errorHandler.middleware(), { before: "cors", tag: "errorHandler" });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
exports.PluginErrorHandler = PluginErrorHandler;
|
package/package.json
CHANGED
|
@@ -1,36 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nocobase/plugin-error-handler",
|
|
3
3
|
"displayName": "error handler",
|
|
4
|
-
"displayName.zh-CN": "
|
|
5
|
-
"description": "
|
|
6
|
-
"description.zh-CN": "
|
|
7
|
-
"version": "0.
|
|
4
|
+
"displayName.zh-CN": "错误处理器",
|
|
5
|
+
"description": "Handling application errors and exceptions",
|
|
6
|
+
"description.zh-CN": "处理应用程序中的错误和异常",
|
|
7
|
+
"version": "0.12.0-alpha.2",
|
|
8
8
|
"license": "AGPL-3.0",
|
|
9
|
-
"main": "./
|
|
10
|
-
"files": [
|
|
11
|
-
"lib",
|
|
12
|
-
"src",
|
|
13
|
-
"README.md",
|
|
14
|
-
"README.zh-CN.md",
|
|
15
|
-
"CHANGELOG.md",
|
|
16
|
-
"server.js",
|
|
17
|
-
"server.d.ts",
|
|
18
|
-
"client.js",
|
|
19
|
-
"client.d.ts"
|
|
20
|
-
],
|
|
9
|
+
"main": "./dist/server/index.js",
|
|
21
10
|
"devDependencies": {
|
|
22
|
-
"@formily/json-schema": "
|
|
23
|
-
"@nocobase/client": "0.11.1-alpha.5",
|
|
24
|
-
"@nocobase/database": "0.11.1-alpha.5",
|
|
25
|
-
"@nocobase/server": "0.11.1-alpha.5",
|
|
26
|
-
"@nocobase/test": "0.11.1-alpha.5",
|
|
27
|
-
"@nocobase/utils": "0.11.1-alpha.5",
|
|
11
|
+
"@formily/json-schema": "2.x",
|
|
28
12
|
"supertest": "^6.1.6"
|
|
29
13
|
},
|
|
14
|
+
"peerDependencies": {
|
|
15
|
+
"@nocobase/client": "0.x",
|
|
16
|
+
"@nocobase/database": "0.x",
|
|
17
|
+
"@nocobase/server": "0.x",
|
|
18
|
+
"@nocobase/test": "0.x",
|
|
19
|
+
"@nocobase/utils": "0.x"
|
|
20
|
+
},
|
|
30
21
|
"repository": {
|
|
31
22
|
"type": "git",
|
|
32
23
|
"url": "git+https://github.com/nocobase/nocobase.git",
|
|
33
24
|
"directory": "packages/plugin-error-handler"
|
|
34
25
|
},
|
|
35
|
-
"gitHead": "
|
|
26
|
+
"gitHead": "a95e9e2666f0318c955113a4735bc005a2c9a767"
|
|
36
27
|
}
|
package/server.d.ts
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export { default } from './
|
|
3
|
-
|
|
1
|
+
export * from './dist/server';
|
|
2
|
+
export { default } from './dist/server';
|
package/server.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
module.exports = require('./
|
|
1
|
+
module.exports = require('./dist/server/index.js');
|
package/lib/client/index.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
function _client() {
|
|
8
|
-
const data = require("@nocobase/client");
|
|
9
|
-
_client = function _client() {
|
|
10
|
-
return data;
|
|
11
|
-
};
|
|
12
|
-
return data;
|
|
13
|
-
}
|
|
14
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
15
|
-
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
16
|
-
class ErrorHandlerPlugin extends _client().Plugin {
|
|
17
|
-
load() {
|
|
18
|
-
return _asyncToGenerator(function* () {})();
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
var _default = ErrorHandlerPlugin;
|
|
22
|
-
exports.default = _default;
|
package/lib/index.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
Object.defineProperty(exports, "default", {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
get: function get() {
|
|
9
|
-
return _server.default;
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
var _server = _interopRequireDefault(require("./server"));
|
|
13
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
package/lib/locale/en_US.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _default = {
|
|
8
|
-
'unique violation': '{{field}} must be unique',
|
|
9
|
-
'notNull violation': 'notNull violation',
|
|
10
|
-
'Validation error': '{{field}} validation error',
|
|
11
|
-
'notNull Violation': '{{field}} cannot be null'
|
|
12
|
-
};
|
|
13
|
-
exports.default = _default;
|
package/lib/locale/es-ES.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _default = {
|
|
8
|
-
"unique violation": "{{field}} debe ser único",
|
|
9
|
-
"notNull violation": "notNull violación",
|
|
10
|
-
"Validation error": "{{field}} error de validación",
|
|
11
|
-
"notNull Violation": "{{field}} no puede ser null"
|
|
12
|
-
};
|
|
13
|
-
exports.default = _default;
|
package/lib/locale/fr_FR.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _default = {
|
|
8
|
-
'unique violation': '{{field}} doit être unique',
|
|
9
|
-
'notNull violation': 'Violation de contrainte notNull',
|
|
10
|
-
'Validation error': 'Erreur de validation de {{field}}',
|
|
11
|
-
'notNull Violation': '{{field}} ne peut pas être null'
|
|
12
|
-
};
|
|
13
|
-
exports.default = _default;
|
package/lib/locale/ja_JP.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _default = {
|
|
8
|
-
'unique violation': '{{field}} は一意でなくてはなりません',
|
|
9
|
-
'notNull Violation': '{{field}} はNullにできません'
|
|
10
|
-
};
|
|
11
|
-
exports.default = _default;
|
package/lib/locale/pt-BR.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _default = {
|
|
8
|
-
'unique violation': '{{field}} deve ser único',
|
|
9
|
-
'notNull violation': 'violação de não nulo',
|
|
10
|
-
'Validation error': 'erro de validação de {{field}}',
|
|
11
|
-
'notNull Violation': '{{field}} não pode ser nulo'
|
|
12
|
-
};
|
|
13
|
-
exports.default = _default;
|
package/lib/locale/zh_CN.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _default = {
|
|
8
|
-
'unique violation': '{{field}} 字段值是唯一的',
|
|
9
|
-
'notNull violation': '{{field}} 字段不能为空',
|
|
10
|
-
'Validation error': '{{field}} 字段规则验证失败'
|
|
11
|
-
};
|
|
12
|
-
exports.default = _default;
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.ErrorHandler = void 0;
|
|
7
|
-
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
8
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
9
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
10
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
11
|
-
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
12
|
-
class ErrorHandler {
|
|
13
|
-
constructor() {
|
|
14
|
-
this.handlers = [];
|
|
15
|
-
}
|
|
16
|
-
register(guard, render) {
|
|
17
|
-
this.handlers.push({
|
|
18
|
-
guard,
|
|
19
|
-
render
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
defaultHandler(err, ctx) {
|
|
23
|
-
ctx.status = err.statusCode || err.status || 500;
|
|
24
|
-
ctx.body = {
|
|
25
|
-
errors: [{
|
|
26
|
-
message: err.message,
|
|
27
|
-
code: err.code
|
|
28
|
-
}]
|
|
29
|
-
};
|
|
30
|
-
if (ctx.status === 500) {
|
|
31
|
-
console.error(err);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
middleware() {
|
|
35
|
-
const self = this;
|
|
36
|
-
return /*#__PURE__*/function () {
|
|
37
|
-
var _errorHandler = _asyncToGenerator(function* (ctx, next) {
|
|
38
|
-
try {
|
|
39
|
-
yield next();
|
|
40
|
-
} catch (err) {
|
|
41
|
-
ctx.log.error(err);
|
|
42
|
-
var _iterator = _createForOfIteratorHelper(self.handlers),
|
|
43
|
-
_step;
|
|
44
|
-
try {
|
|
45
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
46
|
-
const handler = _step.value;
|
|
47
|
-
if (handler.guard(err)) {
|
|
48
|
-
return handler.render(err, ctx);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
} catch (err) {
|
|
52
|
-
_iterator.e(err);
|
|
53
|
-
} finally {
|
|
54
|
-
_iterator.f();
|
|
55
|
-
}
|
|
56
|
-
self.defaultHandler(err, ctx);
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
function errorHandler(_x, _x2) {
|
|
60
|
-
return _errorHandler.apply(this, arguments);
|
|
61
|
-
}
|
|
62
|
-
return errorHandler;
|
|
63
|
-
}();
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
exports.ErrorHandler = ErrorHandler;
|
package/lib/server/index.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
Object.defineProperty(exports, "default", {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
get: function get() {
|
|
9
|
-
return _server.PluginErrorHandler;
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
var _server = require("./server");
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _default = {
|
|
8
|
-
'unique violation': '{{field}} must be unique',
|
|
9
|
-
'notNull violation': 'notNull violation',
|
|
10
|
-
'Validation error': '{{field}} validation error',
|
|
11
|
-
'notNull Violation': '{{field}} cannot be null'
|
|
12
|
-
};
|
|
13
|
-
exports.default = _default;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _default = {
|
|
8
|
-
"unique violation": "{{field}} debe ser único",
|
|
9
|
-
"notNull violation": "notNull violación",
|
|
10
|
-
"Validation error": "{{field}} error de validación",
|
|
11
|
-
"notNull Violation": "{{field}} no puede ser null"
|
|
12
|
-
};
|
|
13
|
-
exports.default = _default;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _default = {
|
|
8
|
-
'unique violation': '{{field}} doit être unique',
|
|
9
|
-
'notNull violation': 'Violation de contrainte notNull',
|
|
10
|
-
'Validation error': 'Erreur de validation de {{field}}',
|
|
11
|
-
'notNull Violation': '{{field}} ne peut pas être null'
|
|
12
|
-
};
|
|
13
|
-
exports.default = _default;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _default = {
|
|
8
|
-
'unique violation': '{{field}} は一意でなくてはなりません',
|
|
9
|
-
'notNull Violation': '{{field}} はNullにできません'
|
|
10
|
-
};
|
|
11
|
-
exports.default = _default;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _default = {
|
|
8
|
-
'unique violation': '{{field}} deve ser único',
|
|
9
|
-
'notNull violation': 'violação de não nulo',
|
|
10
|
-
'Validation error': 'erro de validação de {{field}}',
|
|
11
|
-
'notNull Violation': '{{field}} não pode ser nulo'
|
|
12
|
-
};
|
|
13
|
-
exports.default = _default;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _default = {
|
|
8
|
-
'unique violation': '{{field}} 字段值是唯一的',
|
|
9
|
-
'notNull violation': '{{field}} 字段不能为空',
|
|
10
|
-
'Validation error': '{{field}} 字段规则验证失败'
|
|
11
|
-
};
|
|
12
|
-
exports.default = _default;
|
package/lib/server/server.js
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.PluginErrorHandler = void 0;
|
|
7
|
-
function _jsonSchema() {
|
|
8
|
-
const data = require("@formily/json-schema");
|
|
9
|
-
_jsonSchema = function _jsonSchema() {
|
|
10
|
-
return data;
|
|
11
|
-
};
|
|
12
|
-
return data;
|
|
13
|
-
}
|
|
14
|
-
function _database() {
|
|
15
|
-
const data = require("@nocobase/database");
|
|
16
|
-
_database = function _database() {
|
|
17
|
-
return data;
|
|
18
|
-
};
|
|
19
|
-
return data;
|
|
20
|
-
}
|
|
21
|
-
function _server() {
|
|
22
|
-
const data = require("@nocobase/server");
|
|
23
|
-
_server = function _server() {
|
|
24
|
-
return data;
|
|
25
|
-
};
|
|
26
|
-
return data;
|
|
27
|
-
}
|
|
28
|
-
function _utils() {
|
|
29
|
-
const data = require("@nocobase/utils");
|
|
30
|
-
_utils = function _utils() {
|
|
31
|
-
return data;
|
|
32
|
-
};
|
|
33
|
-
return data;
|
|
34
|
-
}
|
|
35
|
-
var _errorHandler = require("./error-handler");
|
|
36
|
-
var _en_US = _interopRequireDefault(require("./locale/en_US"));
|
|
37
|
-
var _zh_CN = _interopRequireDefault(require("./locale/zh_CN"));
|
|
38
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
39
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
40
|
-
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
41
|
-
class PluginErrorHandler extends _server().Plugin {
|
|
42
|
-
constructor(...args) {
|
|
43
|
-
super(...args);
|
|
44
|
-
this.errorHandler = new _errorHandler.ErrorHandler();
|
|
45
|
-
this.i18nNs = 'error-handler';
|
|
46
|
-
}
|
|
47
|
-
beforeLoad() {
|
|
48
|
-
this.registerSequelizeValidationErrorHandler();
|
|
49
|
-
}
|
|
50
|
-
registerSequelizeValidationErrorHandler() {
|
|
51
|
-
const findFieldTitle = (instance, path, tFunc) => {
|
|
52
|
-
if (!instance) {
|
|
53
|
-
return path;
|
|
54
|
-
}
|
|
55
|
-
const model = instance.constructor;
|
|
56
|
-
const collection = this.db.modelCollection.get(model);
|
|
57
|
-
const field = collection.getField(path);
|
|
58
|
-
const fieldOptions = _jsonSchema().Schema.compile(field === null || field === void 0 ? void 0 : field.options, {
|
|
59
|
-
t: tFunc
|
|
60
|
-
});
|
|
61
|
-
const title = _utils().lodash.get(fieldOptions, 'uiSchema.title', path);
|
|
62
|
-
return title;
|
|
63
|
-
};
|
|
64
|
-
this.errorHandler.register(err => {
|
|
65
|
-
var _err$errors;
|
|
66
|
-
return (err === null || err === void 0 ? void 0 : (_err$errors = err.errors) === null || _err$errors === void 0 ? void 0 : _err$errors.length) && err instanceof _database().BaseError;
|
|
67
|
-
}, (err, ctx) => {
|
|
68
|
-
ctx.body = {
|
|
69
|
-
errors: err.errors.map(err => {
|
|
70
|
-
return {
|
|
71
|
-
message: ctx.i18n.t(err.type, {
|
|
72
|
-
ns: this.i18nNs,
|
|
73
|
-
field: findFieldTitle(err.instance, err.path, ctx.i18n.t)
|
|
74
|
-
})
|
|
75
|
-
};
|
|
76
|
-
})
|
|
77
|
-
};
|
|
78
|
-
ctx.status = 400;
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
load() {
|
|
82
|
-
var _this = this;
|
|
83
|
-
return _asyncToGenerator(function* () {
|
|
84
|
-
_this.app.i18n.addResources('zh-CN', _this.i18nNs, _zh_CN.default);
|
|
85
|
-
_this.app.i18n.addResources('en-US', _this.i18nNs, _en_US.default);
|
|
86
|
-
_this.app.use(_this.errorHandler.middleware(), {
|
|
87
|
-
before: 'cors',
|
|
88
|
-
tag: 'errorHandler'
|
|
89
|
-
});
|
|
90
|
-
})();
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
exports.PluginErrorHandler = PluginErrorHandler;
|
package/src/client/index.ts
DELETED
package/src/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { default } from './server';
|
package/src/locale/en_US.ts
DELETED
package/src/locale/es-ES.ts
DELETED
package/src/locale/fr_FR.ts
DELETED
package/src/locale/ja_JP.ts
DELETED
package/src/locale/pt-BR.ts
DELETED
package/src/locale/zh_CN.ts
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import { Database } from '@nocobase/database';
|
|
2
|
-
import { MockServer, mockServer } from '@nocobase/test';
|
|
3
|
-
import supertest from 'supertest';
|
|
4
|
-
import { PluginErrorHandler } from '../server';
|
|
5
|
-
describe('create with exception', () => {
|
|
6
|
-
let app: MockServer;
|
|
7
|
-
beforeEach(async () => {
|
|
8
|
-
app = mockServer({
|
|
9
|
-
acl: false,
|
|
10
|
-
});
|
|
11
|
-
await app.cleanDb();
|
|
12
|
-
app.plugin(PluginErrorHandler, { name: 'error-handler' });
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
afterEach(async () => {
|
|
16
|
-
await app.destroy();
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
it('should handle not null error', async () => {
|
|
20
|
-
app.collection({
|
|
21
|
-
name: 'users',
|
|
22
|
-
fields: [
|
|
23
|
-
{
|
|
24
|
-
name: 'name',
|
|
25
|
-
type: 'string',
|
|
26
|
-
allowNull: false,
|
|
27
|
-
},
|
|
28
|
-
],
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
await app.loadAndInstall();
|
|
32
|
-
|
|
33
|
-
const response = await app
|
|
34
|
-
.agent()
|
|
35
|
-
.resource('users')
|
|
36
|
-
.create({
|
|
37
|
-
values: {
|
|
38
|
-
title: 't1',
|
|
39
|
-
},
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
expect(response.statusCode).toEqual(400);
|
|
43
|
-
|
|
44
|
-
expect(response.body).toEqual({
|
|
45
|
-
errors: [
|
|
46
|
-
{
|
|
47
|
-
message: 'name cannot be null',
|
|
48
|
-
},
|
|
49
|
-
],
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it('should handle unique error', async () => {
|
|
54
|
-
app.collection({
|
|
55
|
-
name: 'users',
|
|
56
|
-
fields: [
|
|
57
|
-
{
|
|
58
|
-
name: 'name',
|
|
59
|
-
type: 'string',
|
|
60
|
-
unique: true,
|
|
61
|
-
},
|
|
62
|
-
],
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
await app.loadAndInstall();
|
|
66
|
-
|
|
67
|
-
await app
|
|
68
|
-
.agent()
|
|
69
|
-
.resource('users')
|
|
70
|
-
.create({
|
|
71
|
-
values: {
|
|
72
|
-
name: 'u1',
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
const response = await app
|
|
77
|
-
.agent()
|
|
78
|
-
.resource('users')
|
|
79
|
-
.create({
|
|
80
|
-
values: {
|
|
81
|
-
name: 'u1',
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
expect(response.statusCode).toEqual(400);
|
|
86
|
-
|
|
87
|
-
expect(response.body).toEqual({
|
|
88
|
-
errors: [
|
|
89
|
-
{
|
|
90
|
-
message: 'name must be unique',
|
|
91
|
-
},
|
|
92
|
-
],
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it('should render error with field title', async () => {
|
|
97
|
-
app.collection({
|
|
98
|
-
name: 'users',
|
|
99
|
-
fields: [
|
|
100
|
-
{
|
|
101
|
-
name: 'name',
|
|
102
|
-
type: 'string',
|
|
103
|
-
allowNull: false,
|
|
104
|
-
uiSchema: {
|
|
105
|
-
title: '{{t("UserName")}}',
|
|
106
|
-
},
|
|
107
|
-
},
|
|
108
|
-
],
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
await app.loadAndInstall();
|
|
112
|
-
|
|
113
|
-
const response = await app.agent().resource('users').create({});
|
|
114
|
-
|
|
115
|
-
expect(response.statusCode).toEqual(400);
|
|
116
|
-
|
|
117
|
-
expect(response.body).toEqual({
|
|
118
|
-
errors: [
|
|
119
|
-
{
|
|
120
|
-
message: 'UserName cannot be null',
|
|
121
|
-
},
|
|
122
|
-
],
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
it('should handle unique error with raw sql', async () => {
|
|
127
|
-
const userCollection = app.collection({
|
|
128
|
-
name: 'users',
|
|
129
|
-
autoGenId: false,
|
|
130
|
-
timestamps: false,
|
|
131
|
-
fields: [
|
|
132
|
-
{
|
|
133
|
-
name: 'name',
|
|
134
|
-
type: 'string',
|
|
135
|
-
primaryKey: true,
|
|
136
|
-
},
|
|
137
|
-
],
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
await app.loadAndInstall();
|
|
141
|
-
|
|
142
|
-
app.resourcer.define({
|
|
143
|
-
name: 'test',
|
|
144
|
-
actions: {
|
|
145
|
-
async test(ctx) {
|
|
146
|
-
const db: Database = ctx.db;
|
|
147
|
-
|
|
148
|
-
const sql = `INSERT INTO ${userCollection.model.tableName} (name)
|
|
149
|
-
VALUES (:name)`;
|
|
150
|
-
|
|
151
|
-
await db.sequelize.query(sql, {
|
|
152
|
-
replacements: { name: ctx.action.params.values.name },
|
|
153
|
-
type: 'INSERT',
|
|
154
|
-
});
|
|
155
|
-
},
|
|
156
|
-
},
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
const agent = supertest.agent(app.callback());
|
|
160
|
-
|
|
161
|
-
await agent.post('/test:test').send({
|
|
162
|
-
name: 'u1',
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
const response = await agent.post('/test:test').send({
|
|
166
|
-
name: 'u1',
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
const body = response.body;
|
|
170
|
-
expect(body['errors'][0]['message']).toBeDefined();
|
|
171
|
-
});
|
|
172
|
-
});
|
package/src/server/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { PluginErrorHandler as default } from './server';
|
package/src/server/server.ts
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { Schema } from '@formily/json-schema';
|
|
2
|
-
import { BaseError } from '@nocobase/database';
|
|
3
|
-
import { Plugin } from '@nocobase/server';
|
|
4
|
-
import { lodash } from '@nocobase/utils';
|
|
5
|
-
import { ErrorHandler } from './error-handler';
|
|
6
|
-
import enUS from './locale/en_US';
|
|
7
|
-
import zhCN from './locale/zh_CN';
|
|
8
|
-
|
|
9
|
-
export class PluginErrorHandler extends Plugin {
|
|
10
|
-
errorHandler: ErrorHandler = new ErrorHandler();
|
|
11
|
-
i18nNs = 'error-handler';
|
|
12
|
-
|
|
13
|
-
beforeLoad() {
|
|
14
|
-
this.registerSequelizeValidationErrorHandler();
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
registerSequelizeValidationErrorHandler() {
|
|
18
|
-
const findFieldTitle = (instance, path, tFunc) => {
|
|
19
|
-
if (!instance) {
|
|
20
|
-
return path;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const model = instance.constructor;
|
|
24
|
-
const collection = this.db.modelCollection.get(model);
|
|
25
|
-
const field = collection.getField(path);
|
|
26
|
-
const fieldOptions = Schema.compile(field?.options, { t: tFunc });
|
|
27
|
-
const title = lodash.get(fieldOptions, 'uiSchema.title', path);
|
|
28
|
-
return title;
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
this.errorHandler.register(
|
|
32
|
-
(err) => err?.errors?.length && err instanceof BaseError,
|
|
33
|
-
(err, ctx) => {
|
|
34
|
-
ctx.body = {
|
|
35
|
-
errors: err.errors.map((err) => {
|
|
36
|
-
return {
|
|
37
|
-
message: ctx.i18n.t(err.type, {
|
|
38
|
-
ns: this.i18nNs,
|
|
39
|
-
field: findFieldTitle(err.instance, err.path, ctx.i18n.t),
|
|
40
|
-
}),
|
|
41
|
-
};
|
|
42
|
-
}),
|
|
43
|
-
};
|
|
44
|
-
ctx.status = 400;
|
|
45
|
-
},
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
async load() {
|
|
50
|
-
this.app.i18n.addResources('zh-CN', this.i18nNs, zhCN);
|
|
51
|
-
this.app.i18n.addResources('en-US', this.i18nNs, enUS);
|
|
52
|
-
this.app.use(this.errorHandler.middleware(), { before: 'cors', tag: 'errorHandler' });
|
|
53
|
-
}
|
|
54
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|