【问题标题】:nodejs express: Setting express.static path as parent folder (/..) errornodejs express:将 express.static 路径设置为父文件夹 (/..) 错误
【发布时间】:2021-01-14 13:12:34
【问题描述】:
import express from "express"
import path from "path"

const app = express();
const __dirname = path.resolve();

app.use(express.static(`${__dirname}/../'webapp_test`))   //ERROR

app.get(`/`,(req,res)=>{
    res.sendFile(`${__dirname}/../webapp_test/todo.html`);
});

app.listen(8080);

通过将 express.static() 路径设置为带有转义序列 ${} 的字符串文字

连接localhost:8080like时发生错误

ForbiddenError: Forbidden
    at SendStream.error (WORKING DIRECTORY\node_modules\send\index.js:270:31)
    at SendStream.pipe (WORKING DIRECTORY\node_modules\send\index.js:553:12)
    at sendfile (WORKING DIRECTORY\node_modules\express\lib\response.js:1103:8)
    at ServerResponse.sendFile (WORKING DIRECTORY\node_modules\express\lib\response.js:433:3)
    at file://WORKING DIRECTORY/main.js:13:9
    at Layer.handle [as handle_request] (WORKING DIRECTORY\node_modules\express\lib\router\layer.js:95:5)
    at next (WORKING DIRECTORY\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (WORKING DIRECTORY\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (WORKING DIRECTORYt\node_modules\express\lib\router\layer.js:95:5)
    at WORKING DIRECTORY\node_modules\express\lib\router\index.js:281:22

但是,如果我使用path.join 方法将路径设置为

app.use(express.static(path.join(__dirname,`..`,`webapp_test`));

app.get(`/`,(req,res)=>{
    res.sendFile(path.join(__dirname,`..`,`webapp_test`,`todo.html`));
});

页面加载良好

我错过了什么?

【问题讨论】:

  • const __dirname = path.resolve();这里的目的是什么让我混淆使用 __dirname 作为 const 因为它是保留的
  • 我已经将js文件的类型设置为“模块”以使用“import”而不是require。
  • 这样做,为了使用__dirname,我必须将其设置为路径模块的解析方法

标签: node.js express path


【解决方案1】:

这是因为“../”。这被认为是恶意的,将被 express 阻止,以防止网络用户在理论上通过在 url 中键入 .. 来访问计算机文件系统。 您需要首先通过调用 path.resolve 来解析路径,然后整个计算机文件将其传递给 express。 这本质上是 path.join 的作用,因此在调用 path.join 后它也可以工作。

这意味着你需要更换

res.sendFile(`${__dirname}/../webapp_test/todo.html`);

res.sendFile(path.resolve(`${__dirname}/../webapp_test/todo.html`));

还有

app.use(express.static(`${__dirname}/../'webapp_test`))   //ERROR

app.use(express.static(path.resolve(`${__dirname}/../webapp_test`)))   //ERROR

另一种解决方案是为您的调用指定根目录,例如:

res.sendfile(path, {'root': '/path/to/root/directory'});

希望能回答您的问题。

【讨论】:

    猜你喜欢
    • 2018-07-15
    • 2017-08-31
    • 1970-01-01
    • 2012-02-21
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多