Express / Node로 프로그래밍 방식으로 404 응답을 보내는 방법은 무엇입니까?


185

Express / Node 서버에서 404 오류를 시뮬레이션하고 싶습니다. 어떻게해야합니까?


7
"시뮬레이션 된"은 "실제적인"것과 어떻게 다릅니 까?
Jon Hanna

답변:


273

요즘에는 응답 객체에 전용 status기능 이 있습니다. 전화하기 전에 어딘가에 연결하십시오 send.

res.status(404)        // HTTP status 404: NotFound
   .send('Not found');

7
렌더링 된 페이지에서도 작동합니다.res.status(404).render('error404')
jmu

20
자체적으로 res.status(404);는 AFAIK 응답을 보내지 않습니다. res.status(404).end();예를 들어 두 번째 예 와 같이 무언가에 연결 되거나 예를 들어 다음과 같이되어야합니다 res.end();.res.send('Not found');
UpTheCreek

1
@UpTheCreek, 혼란의 가능성을 피하기 위해 코드에서 첫 번째 예제를 제거합니다.
Drew Noake 님이

1
짧은 버전res.sendStatus(404)
bentesha

47

Express 4.x에 대한 업데이트 된 답변

res.send(404)이전 버전의 Express에서와 같이 사용 하는 대신 새로운 방법은 다음과 같습니다.

res.sendStatus(404);

Express는 "찾을 수 없음"텍스트로 매우 기본적인 404 응답을 보냅니다.

HTTP/1.1 404 Not Found
X-Powered-By: Express
Vary: Origin
Content-Type: text/plain; charset=utf-8
Content-Length: 9
ETag: W/"9-nR6tc+Z4+i9RpwqTOwvwFw"
Date: Fri, 23 Oct 2015 20:08:19 GMT
Connection: keep-alive

Not Found

1
나는 그것이 res.status(404)아니라고 확신합니다 res.sendStatus(404).
Jake Wilson

4
res.sendStatus(404)맞다. 그것은 동등하다res.status(404).send()
저스틴 존슨

2
res.sendStatus(404); 동등하다 res.status(404).send('Not Found')

@JakeWilson 지금 무엇입니까 ??
blacksheep

43

시뮬레이션 할 필요가 없습니다. res.send내가 믿는 두 번째 주장 은 상태 코드입니다. 그 주장에 404를 전달하십시오.

명확하게 설명하겠습니다 . expressjs.org의 문서에 따르면 전달 된 숫자 res.send()는 상태 코드로 해석되는 것처럼 보입니다 . 따라서 기술적으로 다음과 같이 벗어날 수 있습니다.

res.send(404);

편집 : 내 나쁜, res대신에 의미 합니다 req. 응답시 호출해야합니다

편집 : Express 4 send(status)부터이 방법은 더 이상 사용되지 않습니다. Express 4 이상을 사용하는 경우 res.sendStatus(404)대신 :를 사용하십시오. (의견에 대한 팁에 대한 @badcc 감사합니다)


1
404로 메시지를 보낼 수도 있습니다 : res.send(404, "Could not find ID "+id)
Pylinux

상태 코드를 직접 보내는 것은 4.x에서 더 이상 사용되지 않으며 어느 시점에서 제거 될 수 있습니다. 고집하는 것이 가장 .status(404).send('Not found')
Matt Fletcher

2
Express 4의 경우 : "사용되지 않는 res.send (status) 표현 : 대신 res.sendStatus (status) 사용"
badcc

10

아래에 게시 할 사이트에 따르면 서버 설정 방법이 전부입니다. 그들이 보여주는 한 가지 예는 다음과 같습니다.

var http = require("http");
var url = require("url");

function start(route, handle) {
  function onRequest(request, response) {
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");

    route(handle, pathname, response);
  }

  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}

exports.start = start;

그리고 그들의 경로 기능 :

function route(handle, pathname, response) {
  console.log("About to route a request for " + pathname);
  if (typeof handle[pathname] === 'function') {
    handle[pathname](response);
  } else {
    console.log("No request handler found for " + pathname);
    response.writeHead(404, {"Content-Type": "text/plain"});
    response.write("404 Not found");
    response.end();
  }
}

exports.route = route;

이것은 한 가지 방법입니다. http://www.nodebeginner.org/

다른 사이트에서 페이지를 만든 다음로드합니다. 이것은 당신이 찾고있는 것 이상일 수 있습니다.

fs.readFile('www/404.html', function(error2, data) {
            response.writeHead(404, {'content-type': 'text/html'});
            response.end(data);
        });

http://blog.poweredbyalt.net/?p=81


9

로부터 익스프레스 사이트 하는 NOTFOUND 예외를 정의하고 아래의 경우 / 404에 404 페이지 또는 리디렉션을 할 때마다 그것을 던져 :

function NotFound(msg){
  this.name = 'NotFound';
  Error.call(this, msg);
  Error.captureStackTrace(this, arguments.callee);
}

NotFound.prototype.__proto__ = Error.prototype;

app.get('/404', function(req, res){
  throw new NotFound;
});

app.get('/500', function(req, res){
  throw new Error('keyboard cat!');
});

1
이 예제 코드는 더 이상 참조하는 링크에 없습니다. 이것이 이전 버전의 express에 적용될 수 있습니까?
Drew Noakes

실제로 기존 코드에 적용되므로 오류 처리 미들웨어를 사용하여 오류를 잡기 만하면됩니다. 예 :app.use(function(err, res, res, next) { if (err.message.indexOf('NotFound') !== -1) { res.status(400).send('Not found dude'); }; /* else .. etc */ });
alessioalex

0

가장 좋은 방법은 IMO를 사용하는 next()것입니다.

router.get('/', function(req, res, next) {
    var err = new Error('Not found');
    err.status = 404;
    return next(err);
}

그런 다음 오류 처리기가 오류를 처리하고 HTML을 사용하여 오류를 멋지게 꾸밀 수 있습니다.

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