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 能取到图片,不知道哪里有问题。
在你的代码中,你使用了express.static
中间件来处理静态文件的请求。这意味着所有对静态资源的请求都会由这个中间件处理。然而,在你的路由处理函数中,你仍然尝试使用res.sendfile
方法手动发送文件,这导致了路径问题。
问题分析
当你访问http://localhost:3000/files
时,Express会查找匹配的路由。由于/files
路由被定义为一个GET请求,所以它会调用res.sendfile('images/ye.jpg')
。此时,Express会尝试根据当前的工作目录(通常是你的应用根目录)来解析路径'images/ye.jpg'
。如果这个路径相对于当前工作目录不存在,就会报错。
解决方案
你可以通过以下几种方式解决这个问题:
-
删除手动的sendfile调用:既然你已经配置了
express.static
来处理静态文件,就不再需要手动调用res.sendfile
。删除这部分代码可以让Express自动处理静态文件的请求。 -
正确设置路径:如果你确实需要手动发送文件,确保路径是相对于当前工作目录或绝对路径。例如,如果你的应用根目录是
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'
,这会导致路径解析错误。
解决方案
- 修改路径:你可以修改路径以确保它是相对于基础目录
./public
的。 - 使用绝对路径:也可以使用绝对路径来避免混淆。
示例代码
修改后的代码如下:
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
文件。