res.sendFile absolute path
If I do a
res.sendfile('public/index1.html');
then I get a server console warning
express deprecated
res.sendfile
: Useres.sendFile
instead
but it works fine on the client side.
But when I change it to
res.sendFile('public/index1.html');
I get an error
TypeError: path must be absolute or specify root to
res.sendFile
and index1.html
is not rendered.
I am unable to figure out what the absolute path is. I have public
directory at the same level as server.js
. I am doing the res.sendFile
from with server.js
. I have also declared app.use(express.static(path.join(__dirname, 'public')));
Adding my directory structure:
/Users/sj/test/
....app/
........models/
....public/
........index1.html
What is the absolute path to be specified here ?
I'm using Express 4.x.
The express.static
middleware is separate from res.sendFile
, so initializing it with an absolute path to your public
directory won't do anything to res.sendFile
. You need to use an absolute path directly with res.sendFile
. There are two simple ways to do it:
res.sendFile(path.join(__dirname, '../public', 'index1.html'));
res.sendFile('index1.html', { root: path.join(__dirname, '../public') });
Note: __dirname
returns the directory that the currently executing script is in. In your case, it looks like server.js
is in app/
. So, to get to public
, you'll need back out one level first: ../public/index1.html
.
Note: path
is a built-in module that needs to be require
d for the above code to work: var path = require('path');
Just try this instead:
res.sendFile('public/index1.html' , { root : __dirname});
This worked for me. the root:__dirname will take the address where server.js is in the above example and then to get to the index1.html ( in this case) the returned path is to get to the directory where public folder is.
res.sendFile( __dirname + "/public/" + "index1.html" );
where __dirname
will manage the name of the directory that the currently executing script ( server.js
) resides in.
An alternative that hasn't been listed yet that worked for me is simply using path.resolve
with either separate strings or just one with the whole path:
// comma separated
app.get('/', function(req, res) {
res.sendFile( path.resolve('src', 'app', 'index.html') );
});
Or
// just one string with the path
app.get('/', function(req, res) {
res.sendFile( path.resolve('src/app/index.html') );
});
(Node v6.10.0)
Idea sourced from https://stackoverflow.com/a/14594282/6189078