我在我的项目中使用mongoose
库和connect-mongo
会话。目前正在做测试,在与 mongoDB 服务器断开连接时,在挂钩e2e
内给了我以下内容:afterAll
MongoRuntimeError: illegal state transition from [closing] => [connected], allowed: [closing,closed]
app.ts
import express from "express";
import dotenv from "dotenv";
import csurf from "csurf";
import cookieParser from "cookie-parser";
import session from "express-session";
import MongoStore from "connect-mongo";
import { connect, connection } from "mongoose";
import { routes } from "./routes";
import { globalErrorHandler } from "./controllers/error.controller";
import { catchAsync } from "./utils/catchAsync.util";
import { validator } from "./middlewares/validator.middleware";
import { AppError } from "./common/errors/app.error";
import { ReasonPhrases, StatusCodes } from "http-status-codes";
dotenv.config();
const app = express();
// disconnect().then(() => {
// connections[0].close();
// });
connect(process.env.DB_URI_DEV).catch((err) => {
console.error("Error while connecting to MongoDB", err);
});
app.use(express.json());
app.use(cookieParser());
// Register CSRF protection
app.use(
csurf({
cookie: true,
})
);
app.use(
session({
secret: process.env.SESSION_SECRET,
saveUninitialized: false,
resave: false,
store: MongoStore.create({
clientPromise: connection.getClient().connect(),
}),
})
);
// Register routes`
routes.map((route) =>
app[route.method](
route.path,
validator(route.validationSchema),
route.middlewares ? route.middlewares : [],
catchAsync(route.handler)
)
);
// Get CSRF token
app.get("/csrf", (req, res, next) => {
res.json({ csrf: req.csrfToken() });
});
app.use("*", (req, res, next) => {
next(
new AppError(
`Cannot ${req.method} ${req.path} on this server`,
"This endpoint does not have a handler",
StatusCodes.NOT_FOUND,
ReasonPhrases.NOT_FOUND
)
);
});
app.use(globalErrorHandler);
export default app;
server.ts
import app from "./app";
const server = app.listen(process.env.PORT, () => {
console.log(`Listening on: ${process.env.PORT}`);
});
export default server;
我的笑话测试文件
jest.setTimeout(30000);
import request from "supertest";
import server from "../../server";
import { disconnect } from "mongoose";
describe.only("Auth", () => {
let csrftoken: string;
let cookie: string;
beforeAll(async () => {
const response = await request("http://localhost:8000")
.get("/csrf")
.set("Content-Type", "application/json");
csrftoken = response.body.csrf;
cookie = response.headers["set-cookie"][0];
});
afterAll((done) => {
server.close(() => {
disconnect(done); // error here
});
});
describe("Regsiter - POST /auth/register", () => {
it(`Expect to fail due to missing request body fields`, (done) => {
request(server)
.post("/auth/register")
.set({
"Content-Type": "application/json",
"csrf-token": csrftoken,
Cookie: cookie,
})
.expect(400, done);
});
});
});