pillarjs / path-to-regexp

Turn a path string such as `/user/:name` into a regular expression
MIT License
8.09k stars 370 forks source link

How to use newer versions with express? #66

Closed georgir closed 4 years ago

georgir commented 8 years ago

Express 4.13.3 seems to depend on old path-to-regexp version 0.1.7 A lot of cool things that work in the express route tester turn out to not actually work in express, and I assume it is because of the version difference. Is there a recommended way to get express to use the new versions, or should I just hack its package.json, or what?

blakeembrey commented 8 years ago

I don't think so, but cc @dougwilson

There's some things in router that will help eventually with this, such as the 2.0 router using the new path-to-regexp and having a plugable path engine, but for now I don't think there's a way.

dougwilson commented 8 years ago

Yes, in the current router, there is not a simple way to use an updated version of path-to-regexp except wait for router@2 or express@5 to come out with the updated module.

frogcjn commented 8 years ago

How can I use the latest version path-to-regexp with express 4?

frogcjn commented 8 years ago

Is this the right way? npm install path-to-regexp --save (v1.5.3)

import * as pathRegexp from "path-to-regexp" // v1.5.3

// for path "/signup:phone"
router.post(pathRegexp("/signup\\:phone"), wrap(async (req, res) => {
    return res.json({ success: true, message: "Success!"})
}))
blakeembrey commented 8 years ago

@frogcjn As mentioned, it's not really possible. You can use the output of path-to-regexp, of course, but you have to remember that it only outputs a RegExp and any matches will be all numeric when used with the existing router (no params population based on the name).

georgir commented 8 years ago

Ultimately, it seems that the keys need to go into the regexp's "keys" property, but that is being overwritten with numeric keys. So you could use defineProperty to make it have the correct value and be readonly (with setter to silently ignore updates, not throw an exception) before you pass it to express's .use .post .get etc. It's a bit of a weird workaround tho. EDIT: Here's a fiddle illustrating the hack: https://jsfiddle.net/3e9crswm/ EDIT 2: Well, cancel this. It seems express does not use the regexp's keys property after all, but uses the original keys array that it passed to pathToRegexp. So this whole stunt is in vain.

georgir commented 8 years ago

I think it might be a good idea to change regexpToRegexp to respect any existing keys property instead of overwriting it. It could even be backported to an old path-to-regexp version that express can use, but will be a good feature without that too.

jonchurch commented 4 years ago

Closing as resolved