res.sendFile 절대 경로


137

내가하면

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

그런 다음 서버 콘솔 경고가 나타납니다.

더 이상 res.sendfile사용 되지 않는 표현 : res.sendFile대신 사용

그러나 클라이언트 측에서는 잘 작동합니다.

그러나 내가 그것을 바꿀 때

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

오류가 발생합니다

TypeError : 경로는 절대적이거나 루트를 지정해야합니다 res.sendFile

index1.html렌더링되지 않습니다.

절대 경로가 무엇인지 알 수 없습니다. 나는이 public같은 수준에서 디렉토리를 server.js. 내가 뭐하는 거지 res.sendFile와에서 server.js. 나는 또한 선언했다app.use(express.static(path.join(__dirname, 'public')));

내 디렉토리 구조 추가 :

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

여기서 지정할 절대 경로는 무엇입니까?

Express 4.x를 사용하고 있습니다.


당신이 사용하는 경우 express.static공용 디렉토리를 제공하는 미들웨어를, 왜 필요합니까 res.sendFile보내 public/index1.html?
Mike S

1
내가 전화 했어 res.sendFile내에서 app.get('/', function(req, res){res.sendFile("...")})수요를 보낼 수 있습니다.
카야 토스트

답변:


310

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.js는입니다 app/. 에 가려면 public먼저 한 수준을 되돌려 야합니다 ../public/index1.html.

참고 : 위의 코드가 작동하려면 path내장 모듈 이 필요합니다 require.var path = require('path');


14
res.sendFile('../public/index.html', {root: __dirname});또한 작동하고 더 짧습니다
Fabien Sa

express 및 webstorm ide로 작업 : 오류가 발생하지 console.log(path.join(__dirname, '../public', 'index.html'));않았지만 다음 res.sendFile(path.join(__dirname, '../public', 'index.html'));작업 만 수행 var path = require('path');
Quake1TF

sendFile에서 사용할 수 있도록 절대 경로를 미리 정의 할 수있는 방법이 없습니까?
eran otzap

4
res.sendFile('../public/index.html', {root: __dirname});루트 이상으로 올라가서 403 Forbidden을 반환하므로 더 이상 작동하지 않습니다. 수행 res.sendFile('public/index.html', {root: path.dirname(__dirname)});하는 대신.
Trevor Robinson

48

대신 이것을 시도하십시오 :

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

이것은 나를 위해 일했습니다. root : __ dirname은 위의 예제에서 server.js가있는 주소를 가져온 다음 index1.html (이 경우)에 도달하는 경로는 공용 폴더가있는 디렉토리로 이동하는 것입니다.


이 옵션이 문서화되지 않은 이유는 무엇입니까?
timkay

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

여기서 __dirname현재 실행중인 스크립트 ( server.js) 가있는 디렉토리의 이름을 관리합니다 .


이 솔루션은 매우 간단했습니다. 도움을 주셔서 감사합니다. 사람들이 왜 'path'패키지를 사용하여 동일한 작업을 수행해야하는지 궁금합니다.
3

3
@TheThird path는 사용하여 OS 독립적으로 만듭니다.
kmonsoor

7

아직 나열되지 않은 대안은 단순히 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에서 제공합니다.


6

다른 답변을 바탕으로 가장 일반적인 요구 사항을 달성하는 방법에 대한 간단한 예입니다.

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응답 하는 간단한 방법으로도 두 배가됩니다 *. 웹앱의 가장 일반적인 사용 사례입니다. /루트 경로에서만 색인을 리턴하도록 변경하십시오 .


좋은. 좋고 간결합니다.
lharby

5

나는 이것을 시도했고 효과가 있었다.

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

4

process.cwd() 프로젝트의 절대 경로를 반환합니다.

그런 다음 :

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

3

적은 코드를 작성하여이를 수행하는 다른 방법입니다.

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

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

5
"TypeError : 경로가 절대적이거나 res.sendFile에 루트를 지정해야합니다"를 생성합니다
GreenAsJade

1

sendFile 대신 send를 사용하면 오류가 발생하지 않습니다! 이 작품은 당신을 도울 것입니다!

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');

사용자가 파일을 다운로드 한 후 동일한 페이지에서 즉시 파일을 열려면 위 코드에서 첨부 파일 대신 '인라인'을 작성하십시오.

res.send(data)

0

이 설정을 한 번 설정하고 어디서나 사용하려면 자신 만의 미들웨어를 구성하십시오. 앱을 설정할 때 다음을 사용하여 응답 객체에 새 기능을 정의하십시오.

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

그런 다음 다음과 같이 사용하십시오.

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

0

Node.Js를 사용하고 동일한 문제가 발생했습니다 ... 모든 스크립트를 시작하고 CSS 정적 파일에 링크 할 때 '/'를 추가하면 해결되었습니다.

전에:

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

후:

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

이것이 작동하려면 고속 정적 서버를 설정해야합니다
Hum4n01d
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.