TypeError: Cannot read properties of undefined (reading 'config')

Viewed 5582

This is my app.ts file:

import express, { Request, Response } from "express";
import dotenv from "dotenv";
dotenv.config();
import config from "config";
import responseTime from "response-time";
import connect from "./utils/connect";
import logger from "./utils/logger";
import routes from "./routes";
import deserializeUser from "./middleware/deserializeUser";
import { restResponseTimeHistogram, startMetricsServer } from "./utils/metrics";
import swaggerDocs from "./utils/swagger";

const port = config.get<number>("port");

const app = express();

app.use(express.json());

app.use(deserializeUser);

app.use(
  responseTime((req: Request, res: Response, time: number) => {
    if (req?.route?.path) {
      restResponseTimeHistogram.observe(
        {
          method: req.method,
          route: req.route.path,
          status_code: res.statusCode,
        },
        time * 1000
      );
    }
  })
);

app.listen(port, async () => {
  logger.info(`App is running at http://localhost:${port}`);

  await connect();

  routes(app);

  startMetricsServer();

  swaggerDocs(app, port);
});

And I do get this error message:

yarn dev
yarn run v1.22.17
warning package.json: License should be a valid SPDX license expression
warning ..\..\..\..\package.json: No license field
$ ts-node-dev --respawn --transpile-only src/app.ts
[INFO] 14:02:52 ts-node-dev ver. 1.1.8 (using ts-node ver. 9.1.1, typescript ver. 4.6.3)
TypeError: Cannot read properties of undefined (reading 'config')
    at Object.<anonymous> (C:\Users\A\Desktop\desktop\base_code\back_bc_node\src\app.ts:3:8)
    at Module._compile (node:internal/modules/cjs/loader:1103:14)
    at Module._compile (C:\Users\A\Desktop\desktop\base_code\back_bc_node\node_modules\source-map-support\source-map-support.js:568:25)
    at Module.m._compile (C:\Users\A\AppData\Local\Temp\ts-node-dev-hook-16796532812275466.js:69:33)
    at Module._extensions..js (node:internal/modules/cjs/loader:1155:10)
    at require.extensions.<computed> (C:\Users\A\AppData\Local\Temp\ts-node-dev-hook-16796532812275466.js:71:20)
    at Object.nodeDevHook [as .ts] (C:\Users\A\Desktop\desktop\base_code\back_bc_node\node_modules\ts-node-dev\lib\hook.js:63:13)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Module.require (node:internal/modules/cjs/loader:1005:19)
[ERROR] 14:02:52 TypeError: Cannot read properties of undefined (reading 'config')

Why do I get this error message? I had this code already working with my previous app with dotenv version 10 but when I copied it in my new app with dotenv version 16 I get this error message.

This is my package.json file:

{
  "name": "back_bc_node",
  "version": "1.0.0",
  "main": "index.js",
  "license": "Commercial",
  "scripts": {
    "dev": "ts-node-dev --respawn --transpile-only src/app.ts",
    "build": "tsc"
  },
  "dependencies": {
    "bcrypt": "^5.0.1",
    "config": "^3.3.7",
    "cors": "^2.8.5",
    "dayjs": "^1.11.0",
    "dotenv": "^16.0.0",
    "express": "^4.17.3",
    "jsonwebtoken": "^8.5.1",
    "lodash": "^4.17.21",
    "mongoose": "^6.2.10",
    "nanoid": "^3.3.2",
    "pino": "^7.10.0",
    "pino-pretty": "^7.6.1",
    "prom-client": "^14.0.1",
    "response-time": "^2.3.2",
    "swagger-jsdoc": "^6.2.0",
    "swagger-ui-express": "^4.3.0",
    "zod": "^3.14.4"
  },
  "devDependencies": {
    "@types/bcrypt": "^5.0.0",
    "@types/body-parser": "^1.19.2",
    "@types/config": "^0.0.41",
    "@types/cors": "^2.8.12",
    "@types/express": "^4.17.13",
    "@types/jsonwebtoken": "^8.5.8",
    "@types/lodash": "^4.14.181",
    "@types/nanoid": "^3.0.0",
    "@types/node": "^17.0.23",
    "@types/pino": "^7.0.5",
    "@types/response-time": "^2.3.5",
    "ts-node-dev": "^1.1.8",
    "typescript": "^4.6.3"
  }
}
3 Answers

Try to replace:

import dotenv from "dotenv";

for this:

import * as dotenv from 'dotenv'

I ran into this problem too and I solved it by:

Create a new project, move the important files in the old project (for me, all the src files in the Vue project), then start the project, success!

this is because you are trying to use the syntax for commonJS in es modules. The dotenv.config function is for commonJS and uses TypeScript ES modules. For better usage have a look at dotenv's doc here:

dotenv documentation

Related