Як програмно надіслати відповідь 404 за допомогою Express / Node?


Відповіді:


273

На сьогодні для цього об'єкта відповідей є спеціальна statusфункція . Просто зав'яжіть його кудись, перш ніж дзвонити send.

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

7
Це також працює з res.status(404).render('error404')
наданими

20
Варто зазначити, що власним бажанням res.status(404);надіслати відповідь AFAIK. Його потрібно або прикувати чимось, наприклад, res.status(404).end();або вашим другим прикладом, або слід за ним, наприклад res.end();,res.send('Not found');
UpTheCreek

1
@UpTheCreek, я видалю перший приклад з коду, щоб уникнути потенціалу для цього плутанини.
Дрю Ноакс

1
коротша версіяres.sendStatus(404)
bentesha

47

Оновлений відповідь для Express 4.x

Замість використання res.send(404)як у старих версіях Express, новий метод:

res.sendStatus(404);

Експрес надішле дуже основну відповідь 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).
Джейк Вілсон

4
res.sendStatus(404)правильно. Це рівнозначноres.status(404).send()
Джастін Джонсон

2
Так res.sendStatus(404); , еквівалентно res.status(404).send('Not Found')
Рік

@JakeWilson тепер що це?
чорношкірий

43

Вам не доведеться їх моделювати. Другий аргумент, на res.sendмою думку, - це код статусу. Просто передайте 404 цьому аргументу.

Дозвольте мені пояснити, що: Згідно з документацією на expressjs.org, схоже, що будь-яке число, яке передається, res.send()буде інтерпретуватися як код статусу. Тож технічно ви могли піти:

res.send(404);

Редагувати: Моє погано, я мав на увазі resзамість цьогоreq . Це слід викликати у відповідь

Редагувати: Станом на Експрес 4 send(status)метод застарілий. Якщо ви використовуєте Express 4 або пізнішої версії, використовуйте: res.sendStatus(404)замість цього. (Дякую @badcc за пораду в коментарях)


1
Ви також можете надіслати повідомлення 404: res.send(404, "Could not find ID "+id)
Pylinux

Відправлення коду статусу застаріло в 4.х і, ймовірно, буде видалено в якийсь момент. Найкраще дотримуватися.status(404).send('Not found')
Метт Флетчер

2
Для Express 4: "експрес-застарілий res.send (статус): замість цього використовуйте res.sendStatus (статус)"
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

На сайті Express визначте виняток 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?
Дрю Ноакс

Це фактично стосується існуючого коду, все, що вам потрібно зробити, - це використовувати проміжне програмне забезпечення для обробки помилок, щоб виявити помилку. Напр .: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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.