Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Express res.sendfile抛出禁止的错误_Node.js_Express - Fatal编程技术网

Node.js Express res.sendfile抛出禁止的错误

Node.js Express res.sendfile抛出禁止的错误,node.js,express,Node.js,Express,我有以下代码: res.sendfile( '../../temp/index.html' ) 但是,它会抛出以下错误: Error: Forbidden at SendStream.error (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/send/lib/send.js:145:16) at SendStream.pipe (/Users/Oliver/Development/Per

我有以下代码:

res.sendfile( '../../temp/index.html' )
但是,它会抛出以下错误:

Error: Forbidden
at SendStream.error (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/send/lib/send.js:145:16)
at SendStream.pipe (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/send/lib/send.js:307:39)
at ServerResponse.res.sendfile (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/response.js:339:8)
at exports.boot (/Users/Oliver/Development/Personal/Reader/server/config/routes.js:18:9)
at callbacks (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:161:37)
at param (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:135:11)
at pass (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:142:5)
at Router._dispatch (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:170:5)
at Object.router (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:33:10)
at next (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/connect/lib/proto.js:199:15)

有人能告诉我为什么会这样吗?

我相信这是因为相对路径;“./”被认为是恶意的。首先解析本地路径,然后调用
res.sendfile
。您可以使用
path.resolve
预先解析路径

var path = require('path');
res.sendFile(path.resolve('temp/index.html'));

此答案收集了其他答案/评论中的信息

这取决于您希望包含与进程工作目录(cwd)或文件目录相关的内容。两者都使用
path.resolve
函数(将
var path=require('path')
放在文件顶部

  • 相对于cwd:
    path.resolve('../some/path/to/file.txt');
  • 相对于文件:
    path.resolve(uu dirname+'../some/path/to/file.txt');
从@Joe评论中的链接来看,如果您接受用户对路径的输入(例如,
sendfile('../.ssh/id_rsa')
可能是黑客的第一次尝试),则相对路径听起来像是一种安全风险。

建议使用不同的方法,而且在我看来,它比当前的解决方案更具意义

res.sendFile('index.html',{root:'./temp'});


root选项似乎将
/
设置为项目的根目录。因此,我无法完全确定文件相对于项目根目录的位置,但如果临时文件夹在那里,则可以将
/temp
设置为要发送的文件的根目录。

此外,还可以使用
路径。join

const path=require(“路径”);
路由器.get(“/”,(请求,res)=>{
让indexath=path.join(_dirname,“../public/index.html”);
res.sendFile(indexPath);
});

我相信这是因为相对路径;“../”的原因被认为是恶意的。首先解析本地路径,然后调用
res.sendfile
如何解析本地路径?
path。解析
应该做你需要做的事情。就是这样。想要通过它作为答案吗?对于像meExpress这样的新手来说,更多详细信息会很方便,因为他们认为
sendfile
中的相对路径很糟糕。除非你指定
root
目录参数,如下所示:var path=require('path'));是的,最后的代码!!@MattHarrison ES6 update,对于软件包导入,constvar更受欢迎作为一个新手,我想知道黑客场景是如何出现的?如果你不小心允许用户输入他们想要下载的文件路径,他们可以下载你系统上的任何文件(我举了一个ssh私钥的例子-这将使他们能够假装是你的电脑(中间人等)。有..限制不允许这种可能性,因为只有来自网站的文件可以访问。这是真的,但它使用sendFile(大写F,由Express v4.8.0支持)OP使用的不是旧的sendfile。只是说…=]Ahh…捕捉得好。我没有注意到这个小差异。我还想知道选择的答案是否有效,不是因为它使用
.sendfile
,而是因为它完全依赖于其他东西(路径).谢谢你指出这一点。简单而有效。谢谢!这对我非常有效!