SendFile 绝对路径

如果我做一个

res.sendfile('public/index1.html');

然后我得到一个服务器控制台警告

表达不赞成的 res.sendfile: 使用 res.sendFile代替

但是它在客户端运行良好。

但是当我把它改成

res.sendFile('public/index1.html');

我得到一个错误

TypeError: 路径必须是绝对的或者指定根到 res.sendFile

并且不呈现 index1.html

我不能算出绝对路径是什么。我有与 server.js相同级别的 public目录。我在用 server.jsres.sendFile。我还声明了 app.use(express.static(path.join(__dirname, 'public')));

添加我的目录结构:

/Users/sj/test/
....app/
........models/
....public/
........index1.html

这里要指定的绝对路径是什么?

我用的是 Express 4. x。

360577 次浏览

express.static中间件与 res.sendFile是独立的,因此使用到 public目录的绝对路径初始化它不会对 res.sendFile做任何事情。您需要在 res.sendFile中直接使用绝对路径。有两种简单的方法:

  1. res.sendFile(path.join(__dirname, '../public', 'index1.html'));
  2. res.sendFile('index1.html', { root: path.join(__dirname, '../public') });

注意: __dirname返回当前正在执行的脚本所在的目录。在你的例子中,看起来 server.jsapp/中。因此,要到达 public,首先需要退出一个级别: ../public/index1.html

注意: path是一个内置模块,需要为 required,上面的代码才能工作: var path = require('path');

试试这个:

res.sendFile('public/index1.html' , { root : __dirname});

这招对我很管用。 _ _ dirname 将获取上面示例中 server.js 所在的地址,然后到达 index1.html (在本例中)返回的路径是到达公用文件夹所在的目录。

res.sendFile( __dirname + "/public/" + "index1.html" );

其中,__dirname将管理当前正在执行的脚本(server.js)所在的目录的名称。

另一种方法是编写更少的代码。

app.use(express.static('public'));


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

我试过了,奏效了。

app.get('/', function (req, res) {
res.sendFile('public/index.html', { root: __dirname });
});

还有一种替代方法,我还没有列出来,那就是简单地使用带有单独字符串的 path.resolve,或者只使用带有整个路径的字符串:

// comma separated
app.get('/', function(req, res) {
res.sendFile( path.resolve('src', 'app', 'index.html') );
});

或者

// just one string with the path
app.get('/', function(req, res) {
res.sendFile( path.resolve('src/app/index.html') );
});

(节点 v6.10.0)

来源于 https://stackoverflow.com/a/14594282/6189078的想法

process.cwd()返回项目的绝对路径。

然后:

res.sendFile( `${process.cwd()}/public/index1.html` );

如果您想设置一次并在任何地方使用它,只需配置您自己的中间件。在设置应用程序时,使用以下方法在 response 对象上定义一个新函数:

app.use((req, res, next) => {
res.show = (name) => {
res.sendFile(`/public/${name}`, {root: __dirname});
};
next();
});

然后按如下方式使用:

app.get('/demo', (req, res) => {
res.show("index1.html");
});

基于其他答案,下面是一个简单的例子,说明如何完成最常见的要求:

const app = express()
app.use(express.static('public')) // relative path of client-side code
app.get('*', function(req, res) {
res.sendFile('index.html', { root: __dirname })
})
app.listen(process.env.PORT)

这也是到 对每个请求使用 index.html 进行响应的一种简单方法,因为我使用一个星号 *来捕获静态(公共)目录中没有找到的所有文件; 这是 web 应用程序最常见的用例。更改为 /以仅在根路径中返回索引。

我使用 Node.Js,遇到了同样的问题... ... 我解决了在每个脚本的开头添加一个’/’并链接到一个 css 静态文件的问题。

以前:

<link rel="stylesheet" href="assets/css/bootstrap/bootstrap.min.css">

之后:

<link rel="stylesheet" href="/assets/css/bootstrap/bootstrap.min.css">

您可以使用 send 代替 sendFile,这样您就不会遇到错误! 这个可以帮助你!

fs.readFile('public/index1.html',(err,data)=>{
if(err){
consol.log(err);
}else {
res.setHeader('Content-Type', 'application/pdf');

告诉浏览器你的回复是 PDF 格式

res.setHeader('Content-Disposition', 'attachment; filename='your_file_name_for_client.pdf');

如果您希望在用户下载后立即在同一页面上打开该文件,请在上面的代码中写入“ inline”而不是附件。

res.send(data)

下面这些对我很有用

res.sendFile(path.resolve(__dirname,'./path_to_file_from_current_directory'));

对我有用:

res.sendFile("./public/filename.ext", { root: "./" });