Node.js - res.sendFile - 错误:ENOENT但路径正确

时间:2016-11-30 17:01:15

标签: node.js express sendfile

我正在尝试渲染一个index.html,但即使使用正确的路径,我也会收到错误信息。

//folders tree
test/server.js
test/app/routes.js
test/public/views/index.html

//routes.js    
app.get('*', function(req, res) {
    res.sendFile('views/index.html');
});


//server.js
app.use(express.static(__dirname + '/public'));
require('./app/routes')(app);

我也试过

res.sendFile(__dirname + '/public/views/index.html');

如果我使用

res.sendfile('./public/views/index.html');

然后它可以工作,但我看到一个警告,说sendfile已被弃用,我必须使用sendFile。

4 个答案:

答案 0 :(得分:5)

尝试添加:

 var path = require('path');
 var filePath = "./public/views/index.html"
 var resolvedPath = path.resolve(filePath);
 console.log(resolvedPath);
 return res.sendFile(resolvedPath);

这应该清除文件路径是否符合您的预期

答案 1 :(得分:0)

尝试使用root选项,它为我做了:

var options = {
    root: __dirname + '/public/views/',
};

res.sendFile('index.html', options, function (err) {
    if (err) {
      console.log(err);
      res.status(err.status).end();
    }
    else {
      console.log('Sent:', fileName);
    }
  });

答案 2 :(得分:0)

问题是你已经定义了静态文件中间件,但是你在那之前定义了一个尝试处理静态文件服务的路由(所以静态文件中间件实际上什么也没做)。因此,如果你想从一条路线res.sendFile得到某些东西,你需要给它一个绝对路径。或者,您可以删除app.get('*', ...)路由并让快速中间件完成其工作。

答案 3 :(得分:0)

你可以尝试下面的代码

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.use(express.static(path.join(__dirname, 'public/views')));

处理api电话

app.use('/', function(req, res, next) {
    console.log('req is -> %s', req.url);
    if (req.url == '/dashboard') {
        console.log('redirecting to  -> %s', req.url);
        res.render('dashboard');
    } else {
        res.render('index');
    }

});