Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Express.js "path must be absolute or specify root to res.sendFile" error

NOTE : This is NOT a duplicate question, I've already tried other answers to similar questions.

I'm trying to render html files (Angular) but I'm having an issue. This works.

app.get('/randomlink', function(req, res) {
    res.sendFile( __dirname + "/views/" + "test2.html" );
});

But I don't want to copy and paste dirname thingy over and over, so I tried this in order to not to be repetitive with urls:

app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'views')));

app.get('/randomlink', function(req, res) {
     res.sendFile('test2.html'); // test2.html exists in the views folder
 });

Here's the error.

My express version is 4.13

path must be absolute or specify root to res.sendFile

like image 624
salep Avatar asked Dec 11 '15 05:12

salep


3 Answers

If you look into the express code for sendFile, then it checks for this condition:

if (!opts.root && !isAbsolute(path)) {
    throw new TypeError('path must be absolute or specify root to res.sendFile');
}

So You must need to pass Absolute path or relative path with providing root key.

res.sendFile('test2.html', { root: '/home/xyz/code/'});

And if you want to use relative path and then you can make use path.resolve to make it absolute path.

var path = require('path');
res.sendFile(path.resolve('test2.html'));
like image 143
Hiren S. Avatar answered Oct 20 '22 00:10

Hiren S.


You can't go against official documentation of res.sendFile()

Unless the root option is set in the options object, path must be an absolute path to the file.

But I understand that you don't want to copy smth like __dirname every time, and so for your purpose I think you can define your own middleware:

function sendViewMiddleware(req, res, next) {
    res.sendView = function(view) {
        return res.sendFile(__dirname + "/views/" + view);
    }
    next();
}

After that you can easily use this middleware like this

app.use(sendViewMiddleware);

app.get('/randomlink', function(req, res) {
    res.sendView('test2.html');
});
like image 35
Rashad Ibrahimov Avatar answered Oct 19 '22 23:10

Rashad Ibrahimov


Easiest way is to specify the root:

res.sendFile('index.html', { root: __dirname });
like image 1
A-Sharabiani Avatar answered Oct 19 '22 23:10

A-Sharabiani