0

我在我的项目中使用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);
    });
  });
});
4

0 回答 0