我在 Node/Express 中创建 RESTful API 时遇到一些问题。在我正在构建的应用程序中,用户有许多消息,并且消息属于用户。我需要能够发出 HTTP 请求来检索特定用户的所有消息。这是应用程序的基本结构,从基本服务器开始,它将路由委托(delegate)给名为“config/middleware.js”的文件。
//server.js
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
require('./config/middleware.js')(app, express);
var port = process.env.PORT || 8080;
app.use(bodyParser.json());
app.use(express.static(__dirname + '/../client'));
app.listen(port);
这是我们将请求发送到适当路由器的中间件文件。对“users/5/messages”发出的请求将被路由到消息路由器,对“users/5”发出的请求将被路由到用户路由器。
// config/middleware.js
module.exports = function(app, express) {
var usersRouter = express.Router();
var messagesRouter = express.Router();
app.use('/users/:userId/messages', messagesRouter);
app.use('/users', usersRouter);
require('../routers/users')(usersRouter);
require('../routers/messages')(messagesRouter);
};
这是消息路由器。如果向“/users/5/messages”发出 get 请求,我希望运行 getAllMessages 函数,该函数应返回 userId 5 的用户的所有消息。
// routers/messages.js
var messagesController = require('../controllers/messages');
module.exports = function(app) {
app.get('/:messageId', messagesController.getMessage);
app.get('/', messagesController.getAllMessages);
};
问题在于 getAllMessages 函数无法访问“userId”参数(值为 5),而这是对数据库进行适当查询所必需的。 Controller 中的 getAllMessages 函数期望将 userId 存储在 req.params.userId 上。有没有办法让 userId 5 出现在 getAllMessages 函数内的 req.params 对象上?
最佳答案
req.params
不会沿着路由链传递。为此,您可以执行类似的操作
在server.js
中,在req
上创建一个 key 。这将在路线之间传递您的数据。在安装路线之前执行此操作。
app.use(function (req, res, next) {
req._data = {};
next();
});
在config/middleware.js
中,
module.exports = function(app, express) {
var usersRouter = express.Router();
var messagesRouter = express.Router();
// attach usedId
app.use('/users/:userId/messages', function (req, res, next) {
req._data.userId = req.params.userId;
next();
});
// mount the router
app.use('/users/:userId/messages', messagesRouter);
app.use('/users', usersRouter);
require('../routers/users')(usersRouter);
require('../routers/messages')(messagesRouter);
};
这样,您就可以访问 routers/messages.js
中的 req._data.userId
。
旁注:构建路线的更好方法是使用类似的东西,(阅读无耻的插件),https://github.com/swarajgiri/express-bootstrap/blob/master/web/routes.js
关于node.js - 在 ExpressJS 中创建模块化 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31930887/