Nodejs 用static设置了路径,为什么res.sendfile的时候路径出错

Nodejs 用static设置了路径,为什么res.sendfile的时候路径出错

var http = require(‘http’);
var express = require(‘express’);
var app = express();
app.use(express.static(’./public’));
app.use(app.router);
app.get(’/files’,function(req,res){
res.sendfile(‘images/ye.jpg’);
});
http.createServer(app).listen(3000, function() {
console.log(‘App started’);
});

代码是这样的,浏览器输入地址http://localhost:3000/files后, 错误提示信息如下: Error: ENOENT, stat 'D:\test\images\ye.jpg’ 但是浏览器输入地址http://localhost:3000/images/ye.jpg 能取到图片,不知道哪里有问题。


5 回复

在你的代码中,你使用了express.static中间件来处理静态文件的请求。这意味着所有对静态资源的请求都会由这个中间件处理。然而,在你的路由处理函数中,你仍然尝试使用res.sendfile方法手动发送文件,这导致了路径问题。

问题分析

当你访问http://localhost:3000/files时,Express会查找匹配的路由。由于/files路由被定义为一个GET请求,所以它会调用res.sendfile('images/ye.jpg')。此时,Express会尝试根据当前的工作目录(通常是你的应用根目录)来解析路径'images/ye.jpg'。如果这个路径相对于当前工作目录不存在,就会报错。

解决方案

你可以通过以下几种方式解决这个问题:

  1. 删除手动的sendfile调用:既然你已经配置了express.static来处理静态文件,就不再需要手动调用res.sendfile。删除这部分代码可以让Express自动处理静态文件的请求。

  2. 正确设置路径:如果你确实需要手动发送文件,确保路径是相对于当前工作目录或绝对路径。例如,如果你的应用根目录是D:\test,那么你应该这样设置路径:

    res.sendfile('./public/images/ye.jpg');
    

示例代码

以下是修改后的代码示例:

var http = require('http');
var express = require('express');
var app = express();

// 使用express.static处理静态文件
app.use(express.static('./public'));

// 删除手动的sendfile调用
// app.get('/files', function(req, res) {
//   res.sendfile('images/ye.jpg'); // 不推荐这样做
// });

http.createServer(app).listen(3000, function() {
  console.log('App started');
});

在这个示例中,我们删除了手动的res.sendfile调用,并确保express.static中间件可以正确地处理静态文件请求。现在,访问http://localhost:3000/files将直接返回/public/images/ye.jpg文件,而不需要额外的路由处理。

希望这能帮助你解决问题!


res.sendfile(’/public/images/ye.jpg’);可以么?

这样是可以的

你这样有两个问题,第一会输出一个流文件,浏览器提示你下载 第二,你要输出文件的时候,默认是相对于app.js这个目录下的

在这个例子中,问题出在使用 res.sendfile 方法时指定的路径。当你使用 app.use(express.static('./public')) 时,Express 会将 ./public 目录设置为静态文件服务的基础目录。然而,在处理 /files 路径时,你直接指定了相对路径 'images/ye.jpg',这会导致路径解析错误。

解决方案

  1. 修改路径:你可以修改路径以确保它是相对于基础目录 ./public 的。
  2. 使用绝对路径:也可以使用绝对路径来避免混淆。

示例代码

修改后的代码如下:

var http = require('http');
var express = require('express');
var app = express();

// 设置静态文件的基础目录为 ./public
app.use(express.static('./public'));

// 修改 /files 路由中的路径
app.get('/files', function(req, res) {
  // 使用相对于 ./public 的路径
  res.sendFile(__dirname + '/public/images/ye.jpg');
});

http.createServer(app).listen(3000, function() {
  console.log('App started');
});

解释

  • __dirname 是当前文件的目录名,这样可以确保路径是相对于项目根目录的。
  • res.sendFile 方法使用绝对路径来发送文件,这样可以避免路径解析错误。

通过这种方式,Express 可以正确地找到并提供 ./public/images/ye.jpg 文件。

回到顶部