【问题标题】:How to use req.params in express 4 with Mongoose如何在 Express 4 中与 Mongoose 一起使用 req.params
【发布时间】:2015-03-26 18:50:00
【问题描述】:

我一直坚持使用 req.params.id 来使用 Mongoose 执行查询。 我使用 Angular,但问题不是来自这里。

我只是把与我的服务器和路由文件有关的代码

routes.js

var Product = require('./models/product');     // My Mongoose model
var express        = require('express');

var router = express.Router(); // Do I really need that ?

// function to retrieve ALL employees (working)

function getEmployees(res){
    Employee.find(function(err, employees) {
    if (err)
        return res.send(err)
    res.json(employees);
    });
};

// function to retrieve ONE employee (not working)

function getEmployeeByID(req,res){
    var query  = Employee.where({ _id: req.params.id });
    query.findOne(function (err, employee) {
        if (err)
            return res.send(err)
        res.json(employee);
        });
    };

module.exports = function(app) {

// !!!!!!!!!!!  PROBLEM IS HERE !!!!!!!!!!!!!!!
app.get('/employees/:employee_id', function(req, res) {
    getEmployeeByID(res);
});


// ALL IS WORKING HERE
app.get('/employees', function(req, res) {
    getEmployees(res);
});

app.post('/employees', function(req, res) {
    Employee.create({
        firstname : req.body.firstname,
        lastname : req.body.lastname,
        age : req.body.age,
        dept : req.body.dept,
        done : false
    }, function(err) {
        if (err)
            res.send(err);
        getEmployees(res);
    });
});


app.delete('/employees/:employee_id', function(req, res) {
    Employee.remove({
        _id : req.params.employee_id
    }, function(err) {
        if (err)
            res.send(err);
        getEmployees(res);
    });
});


app.use('/', router);
module.exports = router;

}; // end module.exports

然后我有我的服务器文件

// modules =================================================
var express        = require('express');
var app            = express();
var mongoose       = require('mongoose');
var bodyParser     = require('body-parser');
var methodOverride = require('method-override');


var db = require('./config/db');
mongoose.connect(db.url);

var port = process.env.PORT || 8080; // set our port

var router = express.Router();

// application -------------------------------------------------------------
router.get('/', function(req, res) {
    res.sendfile('./public/index.html');
});


app.use(bodyParser.json()); // parse application/json 
app.use(bodyParser.json({ type: 'application/vnd.api+json' }));
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(methodOverride('X-HTTP-Method-Override')); 
app.use(express.static(__dirname + '/public')); 

// routes ==================================================
require('./app/routes')(app); // pass our application into our routes

app.listen(port);   
module.exports = app;

问题是当我登陆员工页面时,出现错误:
GET http://localhost:8080/employees/undefined500(内部服务器错误)
这很正常,因为我还没有点击员工所以没有 ID。

但是,即使单击一名员工,也不会检索到其 ID。我的意思是,URL 用 /employees/employee_id 更改,但它不会在函数 getEmployeeByID 中找到 ID。在终端中,所有的 console.log 都给出 UNDEFINED 甚至在点击一个员工之后。

我尝试了很多示例并在 Express 4 上使用了文档,但找不到问题所在。

如果你能提供帮助,谢谢。

【问题讨论】:

    标签: angularjs node.js express mongoose


    【解决方案1】:

    我解决了这个问题。

    userController.js

    exports.getUser  = (req, res) => {
    
    const  _id  =  req.params.id        
    
    UserModel.findById(_id).then((user) => {
    
    if (!user) {
    
    return  res.status(404).send()
    
    }         
    
    res.send(user)
    
    }).catch((error) => {
    
    res.status(500).send(error)
    
    })    
    }
    

    router.js

    router.get('/users/:id', userController.getUser)

    【讨论】:

      【解决方案2】:

      您调用getEmployeeByID 函数的方式有误。 函数签名需要req,然后是res,但您只向它发送res,这将在函数内部被错误地视为req

      另外,你应该用你给它的名字来引用参数,意思是req.params.employee_id

      现在您实际上应该使用 router 而不是 app,这是 Express4 中更经典的做法。

      function getEmployeeByID(req, res){
          var query  = Employee.where({ _id: req.params.employee_id }); // <-- Use the correct param name
          query.findOne(function (err, employee) {
              if (err)
                  return res.send(err)
              res.json(employee);
              });
          };
      
      module.exports = function(app) {
      
      // User router instead of app
      router.get('/employees/:employee_id', function(req, res) {
          getEmployeeByID(req, res); // <-- sending both req and res to the function
      });
      

      我从来没有用过moongoose(我是一个mongodb原生驱动用户)所以不能评论那部分代码。

      【讨论】:

      • 是的,谢谢你我理解我的错误。现在我在浏览器中看到了我的 json 响应 :) 但不是在角度视图中,我必须要修复一些小问题。无论如何,再次感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 2015-09-15
      • 2016-05-23
      • 1970-01-01
      相关资源
      最近更新 更多