Node.jsparsing路由的最小函数

我有一个Node.js / Express应用程序工作,接收路线如下所示:

app.get('/resource/:res', someFunction); app.get('/foo/bar/:id', someOtherFunction); 

这是伟大的,工作正常。

我也使用Socket.IO,并希望有一些服务器调用使用websockets而不是传统的RESTful调用。 但是,我想使它非常干净,几乎使用相同的语法,最好:

 app.sio.get('/resource/:res', someFunction); 

这将给Socket.IO提供一个综合的“REST”接口,从程序员的angular度来看,他没有做任何不同的事情。 只需标记websockets: true从客户端是websockets: true的。

我可以处理所有的细节,如自定义的方式来传递请求动词和parsing它们等,我没有这个问题。 我正在寻找的唯一的东西是一些function,可以parsing路线,如快递,并正确地路由它们。 例如,

 // I don't know how to read the ':bar', 'foo/:bar' // Or handle all complex routings, such as 'foo/:bar/and/:so/on' 

我可以深入挖掘并尝试自己编写代码,或者尝试读取所有明确的“源代码”,并find它们的位置,但我相信它本身存在。 只是不知道在哪里find它。

UPDATE

robertklep提供了一个很好的答案,完全解决了这个问题。 我把它改编成一个完整的解决scheme,我在下面的答案中发布了。

您可以使用Express路由器类来完成繁重的工作:

 var io = require('socket.io').listen(...); var express = require('express'); var sioRouter = new express.Router(); sioRouter.get('/foo/:bar', function(socket, params) { socket.emit('response', 'hello from /foo/' + params.bar); }); io.sockets.on('connection', function(socket) { socket.on('GET', function(url) { // see if sioRouter has a route for this url: var route = sioRouter.match('GET', url); // if so, call its (first) callback (the route handler): if (route && route.callbacks.length) { route.callbacks[0](socket, route.params); } }); }); // client-side var socket = io.connect(); socket.emit('GET', '/foo/helloworld'); 

显然,你可以在请求中传递额外的数据,并把它传给你的路由处理程序(例如一个额外的参数)。

robertklep提供了一个很好的答案,完全解决了这个问题。 我把它改编成一个完整的解决scheme,下面是其他人想要做类似的事情:

节点(服务器端):

 // Extend Express' Router to a simple name app.sio = new express.Router(); app.sio.socketio = require('socket.io').listen(server, { log: false }); // Map all sockets requests to HTTP verbs, which parse // the request and pass it into a simple callback. app.sio.socketio.sockets.on('connection', function (socket) { var verbs = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']; for (var i = 0; i < verbs.length; ++i) { var go = function(verb) { socket.on(verb, function (url, data) { var route = app.sio.match(verb, url); if (route && route.callbacks.length) { var req = {url: url, params: route.params, data: data, socket:socket} route.callbacks[0](req); } }); }(verbs[i]); } }); // Simplify Socket.IO's 'emit' function and liken // it traditional Express routing. app.sio.end = function(req, res) { req.socket.emit('response', req.url, res); } // Here's an example of a simplified request now, which // looks nearly just like a traditional Express request. app.sio.get('/foo/:bar', function(req) { app.sio.end(req, 'You said schnazzy was ' + req.data.schnazzy); }); 

客户端:

 // Instantiate Socket.IO var socket = io.connect('http://xxxxxx'); socket.callbacks = {}; // Similar to the server side, map functions // for each 'HTTP verb' request and handle the details. var verbs = ['get', 'post', 'put', 'path', 'delete']; for (var i = 0; i < verbs.length; ++i) { var go = function(verb) { socket[verb] = function(url, data, cb) { socket.emit(String(verb).toUpperCase(), url, data); if (cb !== undefined) { socket.callbacks[url] = cb; } } }(verbs[i]); } // All server responses funnel to this function, // which properly routes the data to the correct // callback function declared in the original request. socket.on('response', function (url, data) { if (socket.callbacks[url] != undefined) { socket.callbacks[url](data); } }); // Implementation example, params are: // 1. 'REST' URL, // 2. Data passed along, // 3. Callback function that will trigger // every time this particular request URL // gets a response. socket.get('/foo/bar', { schnazzy: true }, function(data){ console.log(data); // -> 'You said schnazzy was true' }); 

感谢您的帮助,robertklep!