Skip to content

Commit b42ec22

Browse files
authored
fix: support default error handler (#2)
fix #1
1 parent 8bfeb0f commit b42ec22

File tree

2 files changed

+43
-9
lines changed

2 files changed

+43
-9
lines changed

src/express-lazy-router.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,28 @@ export function createLazyRouter(options: createLazyLoaderOptions = {}) {
2727
*/
2828
return function lazyRouter(resolver: () => Promise<{ default: express.Router } | express.Router>) {
2929
const lazyRouter = express.Router();
30-
let alreadyLoaded = false;
30+
// Preserve loading order of router for default error handler
31+
// https://github.com/azu/express-lazy-router/issues/1
32+
let loadedRouter: express.Router;
3133
const resolveResolver = () => {
3234
return resolver().then((router) => {
33-
alreadyLoaded = true;
3435
if ("default" in router) {
35-
lazyRouter.use(router.default);
36+
loadedRouter = router.default;
3637
} else {
37-
lazyRouter.use(router);
38+
loadedRouter = router;
3839
}
3940
});
4041
};
41-
lazyRouter.use((_req, _res, next) => {
42-
if (alreadyLoaded) {
43-
return next();
42+
lazyRouter.use((req, res, next) => {
43+
if (loadedRouter) {
44+
// @ts-expect-error: Router#handle is not public?
45+
return loadedRouter.handle(req, res, next);
4446
} else {
4547
// first request handler
4648
resolveResolver()
4749
.then(() => {
48-
next();
50+
// @ts-expect-error: Router#handle is not public?
51+
return loadedRouter.handle(req, res, next);
4952
})
5053
.catch((error) => {
5154
next(error);

test/express-lazy-router.test.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import express, { RequestHandler } from "express";
1+
import express, { ErrorRequestHandler, RequestHandler } from "express";
22
import request from "supertest";
33

44
import { createLazyRouter } from "../src/express-lazy-router";
@@ -65,6 +65,37 @@ describe("express-lazy-router", function () {
6565
requestTracker.verify();
6666
});
6767
});
68+
it("should work with default(last) error handing ", async () => {
69+
const app = express();
70+
const expectedError = new Error("ERROR IN REQUEST HANDLER");
71+
const requestTracker = new assert.CallTracker();
72+
const defaultErrorTracker = new assert.CallTracker();
73+
const shouldBeCalled = defaultErrorTracker.calls(() => {}, 1);
74+
const requestHandler: RequestHandler = requestTracker.calls((_, _res, next) => {
75+
next(expectedError);
76+
}, 1);
77+
app.use(
78+
"/test",
79+
lazyLoad(async () => createMockRouter(requestHandler))
80+
);
81+
app.use(((err, _req, res, _next) => {
82+
shouldBeCalled();
83+
assert.strictEqual(err.message, expectedError.message);
84+
res.status(400).json({
85+
ok: false
86+
});
87+
}) as ErrorRequestHandler);
88+
return request(app)
89+
.get("/test")
90+
.set("Accept", "application/json")
91+
.expect("Content-Type", /json/)
92+
.expect(400)
93+
.then((res) => {
94+
assert.deepStrictEqual(res.body, { ok: false });
95+
requestTracker.verify();
96+
defaultErrorTracker.verify();
97+
});
98+
});
6899
it("should lazy load router when receive request", () => {
69100
const app = express();
70101
const requestTracker = new assert.CallTracker();

0 commit comments

Comments
 (0)