如何在express(node.js)中获取路径变量

18
我试图使用req.params获取路径变量"userId"的值,但是我得到了undefined。如果有人能指导我解决这个问题,我将非常感谢他。我在下面放置了我的代码。 我查看了一些示例,但这些示例也是以这种方式进行操作的,我不知道我的代码出了什么问题。 谢谢。
控制器的父路由
app.use("/user/:userId/group",groupController);

在控制器中的操作

Router.post("/", function (req, res, next) {

    var group = new Group(req.body);

    console.log(req.params);

    group.userId = req.params.userId;

    group.save(new dataCallbacks(req, res, next, "Group").insert());
});

嗯,第一个路由和第二个路由有什么关系?第二个路由只接收根POST请求。 - adeneo
如果他使用 app.use(..),它将不会发布在根目录。 - Bidhan
@adeneo,第一个是控制器的父根,第二个是带有“/”路径的操作以进行发布。 - Qasim Khokhar
@BidhanA 我正在使用“/”路径来提交表单。 - Qasim Khokhar
1个回答

25

我认为你的路由有误,你不能路由到/user/:userId/group并且向/发送请求,这毫无意义。我的意思是,如果要获取userId参数,应该将请求发送到/user/:userId/group

route.js路由文件:

var ctrl = require('controller.js');

app.route('/user/:userId/group').post(ctrl.doIt);

控制器文件controller.js:

exports.doIt = function(req, res, next) {
    var group = new Group(req.body);

    console.log(req.params);

    group.userId = req.params.userId;

    group.save(new dataCallbacks(req, res, next, "Group").insert());
});

我正在使用独立的控制器文件,无法以这种方式执行。 - Qasim Khokhar
我认为你可以将帖子路由更改为中间件,并做出类似于 app.use("/user/:userId/group",require('./path-to/groupController'); 的操作。 注:我会为 HTTP 动词编写单独的路由,例如 getpost/ putdelete - Swaraj Giri
修改了答案,将函数放在不同的文件中。 - michelem
@Michelem但这会损坏我的框架,我必须在app.js中注册特定的操作,而我正试图避免这样做。我需要一个通用的解决方案,因为我必须以这种方式开发Api的捆绑包。 - Qasim Khokhar
我无法理解你的观点。这个方法是有效的,你应该按照这种方式去做(不管在一个或多个文件中,重要的是你不能发送帖子到 / 并期望得到在另一个路由中定义的 userId 参数)。 - michelem
@Michelem 我可以在操作处理程序中移动完整的URL。但我正在尝试避免这种方法。 - Qasim Khokhar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接