web-dev-qa-db-fra.com

Appeler Express Route en interne depuis NodeJS

J'ai un routage ExpressJS pour mon API et je veux l'appeler depuis NodeJS

var api = require('./routes/api')
app.use('/api', api);

et à l'intérieur de mon ./ routes/api.js fichier

var express = require('express');
var router = express.Router();
router.use('/update', require('./update'));  
module.exports = router;

donc si je veux appeler /api/update/something/:withParam depuis mon frontal, tout est trouvé, mais je dois l'appeler à partir d'un autre aspect de mon script NodeJS sans avoir à redéfinir à nouveau la fonction entière au 2ème emplacement

J'ai essayé d'utiliser le module HTTP de l'intérieur mais je reçois juste une erreur "ECONNREFUSED"

http.get('/api/update/something/:withParam', function(res) {
   console.log("Got response: " + res.statusCode);
   res.resume();
}).on('error', function(e) {
  console.log("Got error: " + e.message);
});

Je comprends que l'idée derrière Express est de créer des itinéraires, mais comment les appeler en interne

17
FrickeFresh

La manière "habituelle" ou "correcte" de gérer cela serait d'avoir la fonction que vous voulez appeler décomposée par elle-même, détachée de toute définition de route. Peut-être dans son propre module, mais pas nécessairement. Ensuite, appelez-le partout où vous en avez besoin. Ainsi:

function updateSomething(thing) {
    return myDb.save(thing);
}

// elsewhere:
router.put('/api/update/something/:withParam', function(req, res) {
    updateSomething(req.params.withParam)
    .then(function() { res.send(200, 'ok'); });
});

// another place:
function someOtherFunction() {
    // other code...
    updateSomething(...);
    // ..
}
19
bchociej

C'est un moyen facile de faire une redirection interne dans Express 4:

La fonction que la magie peut faire est: app._router.handle ()

Testing: Nous faisons une demande à home "/" et la redirige vers otherPath "/ autre/chemin"

var app = express()

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

function home(req, res, next) {
  req.url = '/other/path'
  /* Uncomment the next line if you want to change the method */
  // req.method = 'POST'
  return app._router.handle(req, res, next)
}

app.get('/other/path', otherPath)
app.get('/', home)
4
Andres Separ