在ExpressJS中创建模块化REST API

时间:2015-08-10 23:40:10

标签: 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 = 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?

3 个答案:

答案 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)

我一直在寻找相同的东西。 以下是githubauther site

上的模块应用示例

我们也可以根据我们的要求更改或更新结构