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

salep Source

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

node.jsexpress

Answers

answered 3 years ago Hiren S. #1

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

answered 3 years ago Rashad Ibrahimov #2

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

answered 6 days ago A-Sharabiani #3

Easiest way is to specify the root:

res.sendFile('index.html', { root: __dirname });

comments powered by Disqus