Node.js / 表示 req.params 委托请求时清除
Node.js / Express req.params cleared when delegating request
REST API 和 Node 新手在这里。我正在尝试在 nodejs 中创建 REST API。每个用户都能够获得与其用户 ID 关联的项目,并且身份验证机制显然与 url 分开。我正在使用类似以下服务的东西。
/api/users/用户id
/api/users/userid/cars/carid
我希望将来有其他 API 类似于第二个。
问题是如何以干净的方式 'bind' userid
和 carid
或 houseid
参数。我希望能够有一个中间步骤来捕获 users.js 文件中的 'userid' 参数,然后它将请求委托给其他组件。我希望这能让我进行更简洁的身份验证检查,但可能还有更可取的方法。现在的问题是 userid
保证是唯一的,但 carid
和 houseid
只是每个用户唯一的,所以我需要这两个值来检索数据。
我的问题是我怎样才能实现这个或是否有更好的方法来组织它以促进简洁的可重用代码来验证用户是否有权访问该API。另外,如果这非常不符合 REST 风格,请纠正我。
我有以下代码:
app.js
var express = require('express');
var app = express();
app.use('/api', require('./routes/api'));
var server = app.listen(3000, function() {
var host = server.address().address;
var port = server.address().port;
console.log('The server is up at ' + host + ':' + port);
});
./routes/api.js
var express = require('express');
var router = express.Router();
/* GET api listing. */
router.get('/', function(req, res, next) {
res.send('Base of our APIs');
});
router.use('/users', require('./users.js'));
router.use('/', function(req, res) {
res.send('Unauthorized api access. Not authorized for ' + req.baseUrl);
})
module.exports = router;
./routes/users.js
var express = require('express');
var router = express.Router();
router.use('/:user_id/cars', function(req, res, next) {
console.log('Userid is:' + req.params.user_id);
// Authenticate a user here before sending to the next page
var cars_api = require('./cars.js');
cars_api(req, res, next);
});
module.exports = router;
./routes/cars.js
var express = require('express');
var router = express.Router();
/* GET cars for user */
router.get('/', function(req, res, next) {
res.send('Retrieving all cars for user ' + req.params.user_id);
});
router.get('/:car_id', function(req, res, next) {
res.send('Retrieving car with car_id ' + req.params.car_id + ' and user id ' + req.params.user_id);
});
module.exports = router;
我尝试了其他几种调用汽车 API 的方法,所有 req.params 值都被清除。我正在使用 WebStorm 进行调试。
在评论者的建议下,我决定以/users/:user_id/cars/:car_id
.
的形式直接将路线写到汽车api
你不一定需要像那样写完整的路线,你可能想要研究的是嵌套路线,我认为这会有所帮助。
Rest with Express.js nested router
这里有一个很好的例子,我在构建第一个 api 时就开始使用了。
REST API 和 Node 新手在这里。我正在尝试在 nodejs 中创建 REST API。每个用户都能够获得与其用户 ID 关联的项目,并且身份验证机制显然与 url 分开。我正在使用类似以下服务的东西。
/api/users/用户id
/api/users/userid/cars/carid
我希望将来有其他 API 类似于第二个。
问题是如何以干净的方式 'bind' userid
和 carid
或 houseid
参数。我希望能够有一个中间步骤来捕获 users.js 文件中的 'userid' 参数,然后它将请求委托给其他组件。我希望这能让我进行更简洁的身份验证检查,但可能还有更可取的方法。现在的问题是 userid
保证是唯一的,但 carid
和 houseid
只是每个用户唯一的,所以我需要这两个值来检索数据。
我的问题是我怎样才能实现这个或是否有更好的方法来组织它以促进简洁的可重用代码来验证用户是否有权访问该API。另外,如果这非常不符合 REST 风格,请纠正我。
我有以下代码:
app.js
var express = require('express');
var app = express();
app.use('/api', require('./routes/api'));
var server = app.listen(3000, function() {
var host = server.address().address;
var port = server.address().port;
console.log('The server is up at ' + host + ':' + port);
});
./routes/api.js
var express = require('express');
var router = express.Router();
/* GET api listing. */
router.get('/', function(req, res, next) {
res.send('Base of our APIs');
});
router.use('/users', require('./users.js'));
router.use('/', function(req, res) {
res.send('Unauthorized api access. Not authorized for ' + req.baseUrl);
})
module.exports = router;
./routes/users.js
var express = require('express');
var router = express.Router();
router.use('/:user_id/cars', function(req, res, next) {
console.log('Userid is:' + req.params.user_id);
// Authenticate a user here before sending to the next page
var cars_api = require('./cars.js');
cars_api(req, res, next);
});
module.exports = router;
./routes/cars.js
var express = require('express');
var router = express.Router();
/* GET cars for user */
router.get('/', function(req, res, next) {
res.send('Retrieving all cars for user ' + req.params.user_id);
});
router.get('/:car_id', function(req, res, next) {
res.send('Retrieving car with car_id ' + req.params.car_id + ' and user id ' + req.params.user_id);
});
module.exports = router;
我尝试了其他几种调用汽车 API 的方法,所有 req.params 值都被清除。我正在使用 WebStorm 进行调试。
在评论者的建议下,我决定以/users/:user_id/cars/:car_id
.
你不一定需要像那样写完整的路线,你可能想要研究的是嵌套路线,我认为这会有所帮助。
Rest with Express.js nested router
这里有一个很好的例子,我在构建第一个 api 时就开始使用了。