web-dev-qa-db-fra.com

Appel express, méthode GET dans l'itinéraire depuis un autre itinéraire

J'ai plusieurs itinéraires. Comment puis-je obtenir les données de l'itinéraire de l'utilisateur (méthode GET), en les appelant dans la méthode GET de l'itinéraire du groupe? Quelle est la meilleure façon de procéder?

Mon app.js ressemble à ceci:

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);

Ensuite, j'ai un autre fichier 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;

Et un autre itinéraire routes/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;

Merci! :)

11
asuciu

Vous ne devriez pas utiliser le routage pour cela. Appelez simplement la fonction chargée de récupérer les utilisateurs de l'itinéraire des groupes GET et faites ce dont vous avez besoin avec ces données. La façon dont vous proposez est beaucoup plus chère car vous devrez passer un appel http.

Pour simplifier, je suppose que votre logique est synchrone et que les données sont stockées dans data/users.js:

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

dans 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());
});

dans 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');
});
15
Slawomir Pasko

Je considère ce qui a été expliqué "transfert", et c'est très utile, et disponible dans d'autres cadres, dans d'autres langues.

De plus, en tant que "transfert", il n'a pas de surcharge provenant d'une réponse HTTP ultérieure.

Dans le cas d'Express, les éléments suivants sont disponibles dans la version 4.X. Peut-être d'autres versions, mais je n'ai pas vérifié.

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)
11
conrad10781

Vous pouvez utiliser run-middleware module exactement pour ça

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

Plus d'informations:

Divulgation: Je suis le mainteneur et le premier développeur de ce module.

9

Pour les personnes venant ici de Google. Si vous devez atteindre un ou plusieurs de vos itinéraires et ignorer la requête http , vous pouvez également utiliser 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
    });
});

Vous pouvez également les exécuter simultanément avec Promise.all

1
Stavros