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! :)
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');
});
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)
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.
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