如何从路由器访问以前的URL参数

时间:2018-01-02 09:49:44

标签: node.js express parameters

假设我有以下结构:

http://localhost:4000/projects/:project_id/context_items/:ci_id

我有项目和context_items的单独路由器,但问题是 当我在context_items路由时,我需要访问project_id参数,但它在req.param中不存在。

当我设置我的路线时,我会这样做:

module.exports = (app)=>{
    app.param('project_id', (req, res, next, project_id)=>{
    console.error(project_id);
    next();
});

app.param('ci_id', (req, res, next, ci_id)=>{
    console.error(ci_id);
    next();
});

//Routes setting....

const projectsRouter = require("./client/projects");
app.use("/projects", projectsRouter)

const contextItemsRouter = require("./client/context_items");
app.use("/projects/:project_id/context_items", contextItemsRouter);

....

project_id触发但ci_id未命中....我可以编写一个函数并从基本URL中提取project_id,但是访问project_id的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

选中https://expressjs.com/en/4x/api.html#express.router

简而言之:

var router = express.Router({mergeParams: true})

答案 1 :(得分:0)

如果您的GET设置中有API个请求,请执行以下操作:

app.get('/projects/:project_id/context_items/:ci_id', function(req, res) {})

您可以使用project_id访问ci_idreq.param

但是,如果你有一个参数中间件,如:

app.param('[project_id', 'ci_id']', (req, res, next, value)=>{
  next();
});

您可以将任何想要的内容绑定到请求中,例如req.value = value

由于中间件在与project_idci_id参数匹配的每条路径之前运行,因此req.value值会根据您的请求而变化。

因此,如果您的服务器收到此请求:GET /project/12/context_items/24并且您的API设置的路由记录了req.param的值:

app.get('/projects/:project_id/context_items/:ci_id', function(req, res) { 
  console.log(req.value)
 });

首先记录12,然后记录24。