node.js - 在 ExpressJS 中创建模块化 REST API

标签 node.js rest express

我在 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/

相关文章:

javascript - 同一依赖项/服务的多次导入

rest - SpringBoot RestController 为路径 'services/*' 返回 405

node.js - AWS 弹性 Beanstalk/nginx : connect() failed (111: Connection refused

javascript - Node.js 混淆了参数的语法

javascript - 如何使用 Express 从异步方法返回有效响应?

javascript - 捕获所有 http 请求并将 url 发送给父级

java - 剩余遍历 Neo4j java.lang.UnsupportedOperationException

django - 使用 REST 框架查询 URL 中的参数

javascript - 将类似 JSON 的数据转换为字符串,node mysql

Node.js Mongoose 因复杂查询而变得困惑