Skip to content

Commit 9d10551

Browse files
committed
Add exception handling in OpenAPI
1 parent cf57d38 commit 9d10551

File tree

5 files changed

+50
-9
lines changed

5 files changed

+50
-9
lines changed

index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ const run = (statement, p2, p3) => {
3939

4040
const accept = (req, res, fn) => {
4141
const scope = { params: req.params, query: req.query, body: req.body };
42-
const { result } = run(fn, scope, { details: true });
42+
const { result, error } = run(fn, scope, { details: true });
4343
if (!result) res.status(404).end();
44-
else if (result === true) res.end();
45-
else res.send(Number.isInteger(result) ? result.toString() : result);
44+
else if (error) res.status(400).json(result);
45+
else res.status(200).json(result);
4646
};
4747

4848
module.exports = (options) => {

src/libs/openapi.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,10 @@ const load = ({ api, types }) => {
9898
file,
9999
`function ${method}(req, res) {` +
100100
`const scope = { params: req.params, query: req.query, body: req.body };` +
101-
`const result = nucleoid.run(${action},scope);` +
102-
`res.json(result);` +
101+
`const { result, error } = nucleoid.run(${action}, scope, { details: true });` +
102+
`if (!result) res.status(404).end();` +
103+
`else if (error) res.status(400).json(result);` +
104+
`else res.status(200).json(result);` +
103105
`}`
104106
);
105107
fs.appendFileSync(file, `${method}.apiDoc = ${JSON.stringify(apiDoc)};`);

src/services/test/data.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"response": {
1919
"$ref": "#/components/schemas/Item"
2020
},
21-
"action": "function action(req){ const name=req.body.name;const barcode=req.body.barcode;return new Item(name,barcode); }"
21+
"action": "function action(req){ const name=req.body.name;const barcode=req.body.barcode; if(!name) { throw 'INVALID_NAME' } return new Item(name, barcode); }"
2222
}
2323
},
2424
"/items/{item}": {

src/services/test/openapi.spec.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,21 @@ describe("OpenAPI service", () => {
3232
name: "ITEM-1",
3333
});
3434

35-
const res4 = await request(terminal)
35+
const res4 = await request(openapi.app())
36+
.post("/api/items")
37+
.send({ barcode: "BARCODE-1" });
38+
equal(res4.status, 400);
39+
equal(res4.body, "INVALID_NAME");
40+
41+
const res5 = await request(openapi.app())
42+
.get("/api/items/invalid_item")
43+
.send();
44+
equal(res5.status, 404);
45+
equal(res5.text, "");
46+
47+
const res6 = await request(terminal)
3648
.post("/openapi")
3749
.send({ action: "stop" });
38-
equal(res4.status, 200);
50+
equal(res6.status, 200);
3951
});
4052
});

src/test/api.spec.js

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const test = require("../libs/test");
22
const request = require("supertest");
3-
const { deepEqual } = require("assert");
3+
const { equal, deepEqual } = require("assert");
44
const nucleoid = require("../../index");
55
const openapi = require("../libs/openapi");
66
const _ = require("lodash");
@@ -104,4 +104,31 @@ describe("Nucleoid API", () => {
104104
},
105105
]);
106106
});
107+
108+
it("Exception Handling", async () => {
109+
const app = nucleoid(options);
110+
class User {
111+
constructor(name) {
112+
this.name = name;
113+
}
114+
}
115+
nucleoid.register(User);
116+
117+
app.get("/users/:user", (req) => User[req.params.user]);
118+
app.post("/users", (req) => {
119+
const name = req.body.name;
120+
if (!name) {
121+
throw "INVALID_NAME";
122+
}
123+
new User(req.body.name);
124+
});
125+
126+
const res1 = await request(app).post("/users").send();
127+
equal(res1.status, 400);
128+
equal(res1.body, "INVALID_NAME");
129+
130+
const res2 = await request(app).get("/users/invalid_user").send();
131+
equal(res2.status, 404);
132+
deepEqual(res2.text, "");
133+
});
107134
});

0 commit comments

Comments
 (0)