Closed georgir closed 4 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.
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.
How can I use the latest version path-to-regexp with express 4?
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!"})
}))
@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).
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.
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.
Closing as resolved
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?