在另一条路线的路线内快速呼叫GET方法

asu*_*ciu 11 node.js express run-middleware

我有多条路线.如何通过在组路由的GET方法中调用数据来获取用户路由(GET方法)中的数据?这样做的最佳方式是什么?

我的app.js看起来像这样:

var express = require('express');

var routes = require('./routes/index');
var users = require('./routes/users');
var groups = require('./routes/groups');

var app = express();

app.use('/', routes);
app.use('/users', users);
app.use('/groups', groups);

module.exports = app;
app.listen(3000);
Run Code Online (Sandbox Code Playgroud)

然后我有另一个文件routes/users.js:

var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('GET ON THE users!');
});

module.exports = router;
Run Code Online (Sandbox Code Playgroud)

另一条路线路线/ groups.js:

var express = require('express');
var router = express.Router();
var otherRouter = require('./users')

/* GET groups listing. */
router.get('/', function(req, res, next) {

    // call the get on users and retrieve all data from that request

    res.send('GET for the groups');
});

module.exports = router;
Run Code Online (Sandbox Code Playgroud)

谢谢!:)

Sla*_*sko 15

你不应该使用路由.只需调用负责从GET组路由中检索用户的函数,并使用该数据执行所需操作.你建议的方式要贵得多,因为你必须进行http调用.

为简单起见,我假设您的逻辑是同步的,数据存储在data/users.js中:

var data = [{id:1, name: "one"},{id: 2, name: "two"}];
module.exports = function(){
  return data;
};
Run Code Online (Sandbox Code Playgroud)

在routes/users.js中:

var express = require('express');
var router = express.Router();
var getUsers = required('./../data/users');

router.get('/', function(req, res, next) {
  res.send(getUsers());
});
Run Code Online (Sandbox Code Playgroud)

在routes/groups.js中:

var express = require('express');
var router = express.Router();
var otherRouter = require('./users')
var getUsers = require('./.../data/users');

router.get('/', function(req, res, next) {
  var users = getUsers();
  //do some logic to get groups based on users variable value
  res.send('GET for the groups');
});
Run Code Online (Sandbox Code Playgroud)

  • 但这实际上并不是对标题问题的任何答案。 (4认同)

con*_*781 12

我认为正在解释什么是"转发",它非常有用,并且可以在其他框架中以其他语言使用.

此外,作为"前进"它并没有具备从随后的HTTP响应的任何开销.

对于Express,版本4.X中提供以下内容.可能是其他版本,但我没有检查过.

var app = express()

function myRoute(req, res, next) {
  return res.send('ok')
}

function home(req, res, next) {
   req.url = '/some/other/path'

   // below is the code to handle the "forward".
   // if we want to change the method: req.method = 'POST'        
   return app._router.handle(req, res, next)
}

app.get('/some/other/path', myRoute)
app.get('/', home)
Run Code Online (Sandbox Code Playgroud)

  • 我相信这最好地回答了这个问题,无论它是否更优化。 (2认同)

Ami*_*ein 9

您可以run-middleware完全使用模块

app.runMiddleware('/pathForRoute',{method:'post'},function(responseCode,body,headers){
     // Your code here
})
Run Code Online (Sandbox Code Playgroud)

更多信息:

披露:我是该模块的维护者和第一个开发人员.


Sta*_*ros 5

对于从谷歌来到这里的人。如果您需要点击一条或多条路线并跳过 http 请求,您也可以使用supertest

const request = require("supertest");

app.get("/usersAndGroups", async function(req, res) {
    const client = request(req.app);
    const users = await client.get("/users");
    const groups = await client.get("/groups");

    res.json({
        users: users.body,
        groups: groups.body
    });
});
Run Code Online (Sandbox Code Playgroud)

您还可以与Promise.all同时运行它们

  • 我只在测试中使用过 supertest——在 prod 中像这样使用它可以吗? (6认同)