Nodejs Express的URL路由,如何匹配某个固定URL路径下的请求,比如/api
Nodejs Express的URL路由,如何匹配某个固定URL路径下的请求,比如/api
最近在做一个json api接口,需要匹配/api下的请求。 想要的实现是这样的:
app.path(’/api’, function(app){ // 匹配 /api/site_info app.get(’/site_info’, someAction); });
当然可以。以下是如何使用 Node.js 和 Express 来匹配 /api
路径下的请求。我们将创建一个简单的 Express 应用来处理 /api
下的不同请求。
示例代码
首先,确保你已经安装了 Express。如果还没有安装,可以通过 npm 安装:
npm install express
接下来,创建一个简单的 Express 应用程序来处理 /api
下的请求:
const express = require('express');
const app = express();
// 设置 API 基路径为 /api
app.use('/api', (req, res, next) => {
console.log('Handling request to /api path');
next();
});
// 处理 /api/site_info 请求
app.get('/api/site_info', (req, res) => {
res.json({ message: 'Site information retrieved successfully' });
});
// 处理 /api/user 请求
app.get('/api/user', (req, res) => {
res.json({ message: 'User information retrieved successfully' });
});
// 处理所有其他 /api 下的 GET 请求
app.get('/api/*', (req, res) => {
res.status(404).json({ error: 'Not found' });
});
// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
解释
-
设置 API 基路径:
app.use('/api', (req, res, next) => { console.log('Handling request to /api path'); next(); });
这里我们使用
app.use
中间件来拦截所有/api
下的请求,并打印一条日志信息。next()
函数用于继续执行后续中间件或路由处理器。 -
处理具体的 API 请求:
app.get('/api/site_info', (req, res) => { res.json({ message: 'Site information retrieved successfully' }); });
这里定义了一个路由处理器来处理
/api/site_info
的 GET 请求。如果请求匹配该路径,则返回 JSON 响应。 -
处理所有其他 /api 下的 GET 请求:
app.get('/api/*', (req, res) => { res.status(404).json({ error: 'Not found' }); });
这是一个通配符路由处理器,用于匹配
/api
下的所有其他 GET 请求。如果请求没有被前面的特定路由处理器匹配到,则返回 404 错误响应。 -
启动服务器:
const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });
最后,我们启动服务器并监听指定端口。
通过这种方式,你可以轻松地组织和管理 /api
下的多个请求。希望这对你有所帮助!
你需要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吧…
为了匹配 /api
路径下的所有请求,你可以使用 Express 框架的路由前缀功能。Express 本身没有 app.path
这个方法,但你可以通过在路由定义时添加路径前缀来实现相同的效果。
示例代码
const express = require('express');
const app = express();
// 定义一个中间件或路由器处理 /api 下的所有请求
app.use('/api', (req, res, next) => {
console.log('这是一个 API 请求');
next();
});
// 匹配 /api/site_info 的 GET 请求
app.get('/api/site_info', (req, res) => {
res.json({ message: '这是 site_info 的信息' });
});
// 匹配 /api/user 的 POST 请求
app.post('/api/user', (req, res) => {
res.json({ message: '这是用户信息' });
});
// 启动服务器
app.listen(3000, () => {
console.log('服务器运行在 http://localhost:3000');
});
解释
-
app.use('/api', ...)
:- 这是一个中间件函数,它会拦截所有以
/api
开头的请求。 - 你可以在这里添加通用逻辑,例如日志记录、身份验证等。
- 这是一个中间件函数,它会拦截所有以
-
app.get('/api/site_info', ...)
和app.post('/api/user', ...)
:- 使用
app.get
和app.post
分别定义了针对特定路径的 GET 和 POST 请求处理器。 /api/site_info
和/api/user
都是/api
路径下的子路径。
- 使用
-
启动服务器:
- 最后通过
app.listen
方法启动服务器,监听端口 3000。
- 最后通过
这样,所有以 /api
开头的请求都会被相应的路由处理器处理。如果你有更多的路由,可以继续添加类似 app.get
或 app.post
的语句。