Express的URL路由,如何匹配某个固定URL路径下的请求,比如/api
发布于 10 年前 作者 imWildCat 15058 次浏览 最后一次编辑是 8 年前

最近在做一个json api接口,需要匹配/api下的请求。 想要的实现是这样的:

app.path(’/api’, function(app){ // 匹配 /api/site_info app.get(’/site_info’, someAction); });

7 回复

你需要Express4的Router

var apiRouter = express.Router();
apiRouter.get('/site_info', action);

app.use('/api', apiRouter);

我倾向于重复 /api,用平铺的方式写

app.get('/api/site_info', ->)
app.get('/api/other_info', ->)
...

我的方式

app.get "/admin/:module/:action",doAction

doAction = (req,res,next)->
    module = req.params.module
    action = req.params.action
    doSomething(module,action,req,res,next)

当然你可以扩展doSomething的写法 比如你自己的action的方法都是module_action这样的形式的,而你的模块是yourmodule,则如下

yourmodule[module+"_"+action](req,res,next)

还有更多的扩展写法,把你的api做好配置,放到json中,然后读取json配置文件做调用。

我想知道如果平铺的话,怎么把app传到其他文件去 就是app.get如何直接在controller里直接可以写成app.get 就可以写操作了。

我看到一种方法是在app.js里把app声明成global,有没有什么更好的方法?

哈哈 喜欢coffee… ^_^ 不过我一般写成

app.get '/api/site_info', ->

其实 你可以用下面这种方式

server.js文件中

app = express()
require('./routes')(app);

在route.coffee文件中

module.exports = (app) ->
  require('./routes/api1')(app)
  require('./routes/api2')(app)

在routes/api1.coffee文件中

module.exports = (app) ->
	app.route('/api1/xxx')
		.get(controller1.balabala)
		.post(controller1.lalala)
	app.route('/api1/ooo')
		.get(controller1.adfasfdas)
		.post(controller1.ooop)

在routes/api2.coffee文件中

module.exports = (app) ->
	app.route('/api2/xxx')
		.get(controller2.balabala)
		.post(controller2.lalala)
	app.route('/api2/ooo')
		.get(controller2.adfasfdas)
		.post(controller2.ooop)

这样其实也可以很轻松进行接口定义和管理。文档甚至都可以直接写到route对应的js文件里面

你所有的controller是通过exports对外暴露接口…当然就可以接受参数了… 那既然能传参给controller… 那当然也可以吧app传进去了啊。所以 不应该是把app声明成global,而是应该通过参数传递进去。不过话说…不应该在controller直接操作app吧…

回到顶部