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); });

9 回复

当然可以。以下是如何使用 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}`);
});

解释

  1. 设置 API 基路径

    app.use('/api', (req, res, next) => {
        console.log('Handling request to /api path');
        next();
    });
    

    这里我们使用 app.use 中间件来拦截所有 /api 下的请求,并打印一条日志信息。next() 函数用于继续执行后续中间件或路由处理器。

  2. 处理具体的 API 请求

    app.get('/api/site_info', (req, res) => {
        res.json({ message: 'Site information retrieved successfully' });
    });
    

    这里定义了一个路由处理器来处理 /api/site_info 的 GET 请求。如果请求匹配该路径,则返回 JSON 响应。

  3. 处理所有其他 /api 下的 GET 请求

    app.get('/api/*', (req, res) => {
        res.status(404).json({ error: 'Not found' });
    });
    

    这是一个通配符路由处理器,用于匹配 /api 下的所有其他 GET 请求。如果请求没有被前面的特定路由处理器匹配到,则返回 404 错误响应。

  4. 启动服务器

    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');
});

解释

  1. app.use('/api', ...):

    • 这是一个中间件函数,它会拦截所有以 /api 开头的请求。
    • 你可以在这里添加通用逻辑,例如日志记录、身份验证等。
  2. app.get('/api/site_info', ...)app.post('/api/user', ...):

    • 使用 app.getapp.post 分别定义了针对特定路径的 GET 和 POST 请求处理器。
    • /api/site_info/api/user 都是 /api 路径下的子路径。
  3. 启动服务器:

    • 最后通过 app.listen 方法启动服务器,监听端口 3000。

这样,所有以 /api 开头的请求都会被相应的路由处理器处理。如果你有更多的路由,可以继续添加类似 app.getapp.post 的语句。

回到顶部