我在Node / Express中创建RESTful API时遇到了一些麻烦。在我正在构建的应用程序中,用户有许多消息,消息属于用户。我需要能够发出HTTP请求以检索特定用户的所有消息。这是应用程序的基本结构,从基本服务器开始,它将路由委托给名为“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),这是为了对数据库进行适当的查询所必需的。控制器中的getAllMessages函数期望userId存储在req.params.userId中。有没有办法让getIllMessages函数中的req.params对象出现5的userId?
答案 0 :(得分:1)
req.params
未在路径链中传递。为此,您可以执行类似
在server.js
中,在req
上创建一个密钥。这将在路由之间传递您的数据。在安装路线之前执行此操作。
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);
};
这样,您就可以访问req._data.userId
中的routers/messages.js
。
旁注:构建路线的更好方法是使用类似的东西,(读无耻的插件),https://github.com/swarajgiri/express-bootstrap/blob/master/web/routes.js
答案 1 :(得分:0)
您可以使用 app.locals 或 res.locals 传递一些数据。
locals有一个很好的解释。
使用示例:
app.locals.userid = req.params.userId; //binding userid
app.locals.userid // => '5'
OR:放置一个全局变量。
user_id_tmp = req.params.userId;
现在,它已成为app中的全局变量。因此,您可以从任何地方调用 user_id_tmp 变量。
答案 2 :(得分:0)
我一直在寻找相同的东西。 以下是github和auther site
上的模块应用示例我们也可以根据我们的要求更改或更新结构