Node.js 在ExpressJS中创建模块化RESTAPI

Node.js 在ExpressJS中创建模块化RESTAPI,node.js,rest,express,Node.js,Rest,Express,在Node/Express中创建RESTful API时遇到一些问题。在我正在构建的应用程序中,用户有许多消息,消息属于用户。我需要能够发出HTTP请求以检索特定用户的所有消息。下面是应用程序的基本结构,从基本服务器开始,它将路由委托给一个名为“config/middleware.js”的文件 //server.js var express = require('express'); var bodyParser = require('body-parser'); var app = exp

在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);
这是我们将请求发送到相应路由器的中间件文件。向“用户/5/消息”发出的请求将被路由到消息路由器,向“用户/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函数,该函数将返回用户ID为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函数期望用户标识存储在req.params.userId上。有没有办法在getAllMessages函数内的req.params对象上显示5的用户ID?

没有将
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);
};
这样,您就可以访问
routers/messages.js
中的
req.\u data.userId


旁注:构建路由的更好方法是使用(阅读无耻插件),

您可以使用app.localsres.locals传递一些数据

这是一个很好的解释

用法示例:

app.locals.userid = req.params.userId; //binding userid

app.locals.userid // => '5'
或:放置一个全局变量

user_id_tmp = req.params.userId;
现在这在应用程序中变为全局变量。所以你可以在任何地方调用user\u id\u tmp变量。 下面是和上的模块应用程序示例

此外,我们还可以根据需要更改或更新结构