node.jsexpressrouterencodeuricomponent

NodeJS Express Server crashes when router gets an encoded URL


I have a NodeJS and an API that handles get requests.

...
var apiRoutes = express.Router();

apiRoutes.get("/filter/:name",function(req, res){
  // do something
  res.json(result);
}

app.use('/api', apiRoutes);

Then in the client (not an important information but it is Angular2):

find(name:string): void{
    name.trim();
    this.http.get(encodeURI('http://server_address/api/filter/' + name))...

It works well for the parameters don't contain whitespaces, etc. In order to make it working with spaced inputs also, I used encodeURI function. However, when I give an input with whitespaces the server gives error:

undefined:0

^
SyntaxError: Unexpected end of input
    at Object.parse (native)
    at IncomingMessage.<anonymous> (/user/home/server/server.js:65:28)
    at IncomingMessage.EventEmitter.emit (events.js:117:20)
    at _stream_readable.js:920:16
    at process._tickCallback (node.js:415:13)

Any idea what can I do to fix it?


Solution

  • I figured out the problem. I was doing something like:

    apiRoutes.get("/filter/:name",function(req, res){
      http.request(anotherURL + req.body.name)... 
    }
    

    And thought that the name parameter is already encoded since it was encoded in the client. However I see that I have to encode it in the server again.

    apiRoutes.get("/filter/:name",function(req, res){
      http.request(anotherURL + encodeURI(req.body.name))... 
    }