koajs / router

Router middleware for Koa. Maintained by @forwardemail and @ladjs.
MIT License
849 stars 174 forks source link

path-to-regexp@6.2.0 will cause error #140

Closed sakurayang closed 2 years ago

sakurayang commented 2 years ago

node.js version: 14.15.4

npm/yarn and version: 1.11.10

@koa/router version: 10.1.1

koa version: 0.21.5

Code sample:

const Koa = require("koa");
const Router = require("@koa/router");
const app = new Koa();
const http = require("http");

let router = new Router();

router.get("/:name", async ctx => {
    ctx.body = name;
});

app.use(router);

http.createServer(app.callback()).listen(8080);

Expected Behavior:

It will start an HTTP server

Actual Behavior:

internal/modules/cjs/loader.js:311
      throw err;
      ^

Error: Cannot find module '/tmp/x/node_modules/path-to-regexp/dist/index.js'. Please verify that the package.json has a valid "main" entry
    at tryPackage (internal/modules/cjs/loader.js:303:19)
    at Function.Module._findPath (internal/modules/cjs/loader.js:516:18)
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:867:27)
    at Function.Module._load (internal/modules/cjs/loader.js:725:27)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (/tmp/x/node_modules/@koa/router/lib/layer.js:1:42)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32) {
  code: 'MODULE_NOT_FOUND',
  path: '/tmp/x/node_modules/path-to-regexp/package.json',
  requestPath: 'path-to-regexp'
}

So I lookup the lock file and found that path-to-regexp@^6.1.0 was resolved to 6.2.0

path-to-regexp@^6.1.0:
  version "6.2.0"
  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.0.tgz#f7b3803336104c346889adece614669230645f38"
  integrity sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==

... then I dig into node_modules, found the file tree was

.
├── dist.es2015
│   ├── index.js
│   └── index.js.map
├── History.md
├── LICENSE
├── package.json
└── Readme.md

but I try yarn add path-to-regexp@6.1.0, and the file tree was

.
├── dist
│   ├── index.d.ts
│   ├── index.js
│   ├── index.js.map
│   ├── index.spec.d.ts
│   ├── index.spec.js
│   └── index.spec.js.map
├── dist.es2015
│   ├── index.js
│   ├── index.js.map
│   ├── index.spec.js
│   └── index.spec.js.map
├── History.md
├── LICENSE
├── package.json
└── Readme.md

so I recommend changing path-to-regexp@^6.1.0 to path-to-regexp@6.1.0

niftylettuce commented 2 years ago

Running your test I get the following error:

/Users/testuser/Projects/test/node_modules/koa/lib/application.js:123
    if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');
                                  ^

TypeError: middleware must be a function!
    at Application.use (/Users/testuser/Projects/test/node_modules/koa/lib/application.js:123:41)
    at Object.<anonymous> (/Users/testuser/Projects/test/test.js:12:5)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Module.load (internal/modules/cjs/loader.js:950:32)
    at Function.Module._load (internal/modules/cjs/loader.js:790:12)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
    at internal/main/run_main_module.js:17:47
niftylettuce commented 2 years ago

You need to change this:

-app.use(router);
+app.use(router.routes());