Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calling Express Route internally from inside NodeJS

I have an ExpressJS routing for my API and I want to call it from within NodeJS

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

and inside my ./routes/api.js file

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

so if I want to call /api/update/something/:withParam from my front end its all find, but I need to call this from within another aspect of my NodeJS script without having to redefine the whole function again in 2nd location

I have tried using the HTTP module from inside but I just get a "ECONNREFUSED" error

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

I understand the idea behind Express is to create routes, but how do I internally call them

like image 545
FrickeFresh Avatar asked Aug 14 '16 21:08

FrickeFresh


People also ask

How do you call a function in Express route?

Just take the code that figures out what the data response is for the /users route and put it in a separate function. Then call that function from both of the places you want to use it. If it's async, then make the function return a promise that gets resolved with the data.

What is Express Router () in node JS?

js server. The express. Router() function is used to create a new router object. This function is used when you want to create a new router object in your program to handle requests. Multiple requests can be easily differentiated with the help of the Router() function in Express.


3 Answers

The 'usual' or 'correct' way to handle this would be to have the function you want to call broken out by itself, detached from any route definitions. Perhaps in its own module, but not necessarily. Then just call it wherever you need it. Like so:

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(...);
    // ..
}
like image 151
bchociej Avatar answered Oct 10 '22 07:10

bchociej


This is an easy way to do an internal redirect in Express 4:

The function that magic can do is: app._router.handle()

Testing: We make a request to home "/" and redirect it to otherPath "/other/path"

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)
like image 9
Andres Separ Avatar answered Oct 10 '22 07:10

Andres Separ


I've made a dedicated middleware for this : uest.

Available within req it allows you to req.uest another route (from a given route).

It forwards original cookies to subsequent requests, and keeps req.session in sync across requests, for ex:

app.post('/login', async (req, res, next) => {
  const {username, password} = req.body

  const {body: session} = await req.uest({
    method: 'POST',
    url: '/api/sessions',
    body: {username, password}
  }).catch(next)

  console.log(`Welcome back ${session.user.firstname}!`

  res.redirect('/profile')
})

It supports Promise, await and error-first callback.

See the README for more details

like image 2
abernier Avatar answered Oct 10 '22 07:10

abernier