【问题标题】:node express + typescript module not found errornode express + typescript module not found 错误
【发布时间】:2022-01-18 05:33:28
【问题描述】:

我已经用 typescript 设置了一个简单的 node express 应用程序。

我想在 index.ts 文件中添加一个errorMiddleware。

当我启动服务器时出现此错误:

    at Module.require (node:internal/modules/cjs/loader:1005:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at Object.<anonymous> (D:\ActiveProjects\rugBE\src\index.ts:1:1)
    at Module._compile (node:internal/modules/cjs/loader:1101:14)
    at Module.m._compile (C:\Users\UserName\AppData\Roaming\npm\node_modules\ts-node\src\index.ts:1371:23)
    at Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Object.require.extensions.<computed> [as .ts] (C:\Users\UserName\AppData\Roaming\npm\node_modules\ts-node\src\index.ts:1374:12) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ 'D:\\ActiveProjects\\rugBE\\src\\index.ts' ]

我的 package.json:

{
  "name": "rugbe",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.ts",
  "scripts": {
    "dev": "nodemon src/index.ts"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "ts-node": "^10.4.0"
  },
  "devDependencies": {
    "@types/express": "^4.17.13",
    "@types/node": "^16.11.19",
    "nodemon": "^2.0.15",
    "typescript": "^4.5.4"
  }
}

tsConfig:

{
  "compilerOptions": {
    "module": "commonjs",
    "esModuleInterop": true,
    "target": "es6",
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist",
    "baseUrl": "src",
    "paths": {
      "Handlers/*": ["Handlers/*"]
    },
    "resolveJsonModule": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

index.ts:

import express from "express";
import errorMiddleWare from "Handlers/Error/handlerError"; // error here
// import notFoundMiddleWare from "Handlers/Error/notFound";
const app = express();
const port = 5000;

//@ts-ignore
app.get("/api", (_, res) => {
  res.send("Hello World");
});

//notFound

// error
app.use(errorMiddleWare);

// app.all("*", notFoundMiddleWare);

app.listen(port);

我要导入的中间件:

//@ts-ignore
const errorMiddleWare = (err, req, res, next) => {
  // note params are the ones that tell if the errors should come here
  const { statusCode, message } = err;
  res.status(500).json({
    status: "error",
    statusCode: 500,
    message,
  });

  next();
};

export default errorMiddleWare;

我错过了什么?

【问题讨论】:

    标签: node.js typescript express


    【解决方案1】:

    Handlers 是“裸”路径。当你告诉节点导入一个不是以/ 或./(或../)开头的文件时,它会在你的node_modules 目录中查找具有该名称的模块。

    为了添加相对于您当前目录(和其他文件)的文件,请在其前面加上 ./。如果您想全面了解 cjs(CommonJS 模块)模块加载的工作原理,请指定完整算法 here。

    // Before, loads a Handlers package from node_modules
    import errorMiddleWare from "Handlers/Error/handlerError"; // error here
    
    // After, looks for a handlerError module in an
    // Error folder inside the Handlers folder inside the current one
    import errorMiddleWare from "./Handlers/Error/handlerError"; // error here
    
    

    【讨论】:

    • 难道我没有办法配置它,以便我可以拥有这样的路径并告诉编译器不要查看节点模块吗?这就是为什么我在 tsconfig 中添加路径以及在 tsconfig 中排除节点模块的原因。你是正确的,“./”有效,但我试图让它直接。
    • @CodingLittle 是的,可以使用npmjs.com/package/tsconfig-paths(使用与 cjs 相同的配置)。该用例存在该软件包。我不喜欢它(因为模块分辨率很难弄清楚)但这是一种可能性和 YMMV :)
    • 我可能会在这个答案中向您提出很多要求,但我正在努力让它发挥作用。我安装了链接的包,但得到了同样的错误。
    • @CodingLittle 随意打开具体的孤立问题并联系我,我无法帮助“它不起作用”,原始答案表明您知道如何在这里提问。 (安装该软件包后,请确保遵循其说明并在 tsconfig.json 的“路径”部分中指定 Handlers。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2019-06-09
    • 1970-01-01
    • 2020-11-25
    • 2017-02-23
    • 2017-07-10
    相关资源
    最近更新 更多