Express Router param

时间:2015-01-14 01:50:41

标签: mongodb express

我有一些学生模型保存到mongodb实例,我试图通过用户名获取。这是我为学生定义的猫鼬模型:

var studentSchema = mongoose.Schema({
  local : {
    username : String,
    password : String,
  }
});

在我的路线文件中,我正在尝试编写router.param,以便我可以对/ students /<执行CRUD操作用户名>。我的代码如下所示:

router.param('student', function(req, res, next, username) {
  var query = Student.findOne({ 'username' : username });

  query.exec(function(err, student) {
    if (err)
      return next(err);
    if (!student)
      return next(new Error("Can't find student."));

    req.student = student;
    return next();
  });
});

我能够成功查询我的/students路由以获取数据库中的所有学生文档,但我的router.param代码似乎不起作用。每当我尝试curl localhost:8000/students/<username>时,即使学生明显在数据库中并返回“找不到学生”,也找不到学生。错误。我不确定我的router.param代码有什么问题。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

如果您使用router.param,则每次传递该参数时,您都将执行此操作。我不知道这是不是你想要的,但就我所知,你应该使用类似的东西:

 router.get('/students/:username', function(req, res) {
     Student.findOne({'username': req.params.username}, function (doc) {

这样,当您将用户名发送到特定路线时,您将找到该用户并显示您需要的所有数据。

如果有帮助,请告诉我。

答案 1 :(得分:2)

路由器参数函数正在尝试查找具有用户名属性的学生,但根据StudentSchema,它没有用户名属性,它实际上嵌套在本地,将您的查询更改为:

Student.findOne({ 'local.username' : username });

答案 2 :(得分:0)

执行任何操作时,参数名称应相同!

router.param('student', function(req, res, next, student) { <--- Should be student
  var query = Student.findOne({ 'username' : student });<--- Should be student

  query.exec(function(err, student) {
    if (err)
      return next(err);
    if (!student)
      return next(new Error("Can't find student."));

    req.student = student;
    return next();
  });
});