如何在 Express 4 中使用 req.params 和 Mongoose
How to use req.params in express 4 with Mongoose
我一直坚持使用 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/undefined 500(内部服务器错误)
这很正常,因为我还没有点击过员工,所以没有 ID。
但是,即使点击一名员工,也不会检索到它的 ID。我的意思是,URL 已更改为 /employees/employee_id,但它不会在函数 getEmployeeByID 中找到 ID。在终端中,所有 console.log 即使在单击一名员工后也会给出 UNDEFINED。
我尝试了很多示例并在 Express 4 上运行了 Docs,但找不到问题所在。
如有帮助,谢谢。
您调用 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 本地驱动程序用户),因此无法评论那部分代码。
我解决了这个问题。
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)
我一直坚持使用 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/undefined 500(内部服务器错误)
这很正常,因为我还没有点击过员工,所以没有 ID。
但是,即使点击一名员工,也不会检索到它的 ID。我的意思是,URL 已更改为 /employees/employee_id,但它不会在函数 getEmployeeByID 中找到 ID。在终端中,所有 console.log 即使在单击一名员工后也会给出 UNDEFINED。
我尝试了很多示例并在 Express 4 上运行了 Docs,但找不到问题所在。
如有帮助,谢谢。
您调用 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 本地驱动程序用户),因此无法评论那部分代码。
我解决了这个问题。
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)