Ден 25 (седмица 5) - фината разлика между next () и return next ()

Преди да стигна до разликата между обаждане next () и връщане next (), бих искал да обобщя деня.

Нашата нормална петъчна сбирка се състоеше от някои съобщения, малко информация за кариерните услуги и плана за напредък и няколко презентации на проекти, по които работихме. Мисълта е, че представяйки нашия код, ставаме по-добри в разговора за кода. Мисля, че това е чудесно нещо, само ми се иска да имаме повече време да го направим. Едно от моите предложения напред е, че имаме повече официални прегледи на кода на Github, за да практикуваме, използвайки същите инструменти, които най-вероятно ще използваме на работното място, за да прегледаме и коментираме кода на други хора.

Имах и една приятна среща на личност относно моята автобиография и мотивационни писма за компаниите, за които се интересувам да кандидатствам. Всички са така организирани и информирани за напредването на процеса. Мога да кажа, че има дълбок опит и знания как да си намеря работа в разработката на софтуер. Моята надежда е, че мога да взема тази информация и да я използвам за намиране на работа в края на това обучение.

Добре, на разликата между обаждане next () и връщане next (). За първи път забелязах това преди няколко дни, когато работех с някакъв примерен код в нощната домашна работа. Използваме Express за определяне на маршрути и това, което видях, беше нещо подобно.

app.get ('/ post', функция (req, res, next) {
  Post.findById (1234) .then (функция (пост, грешка) {
    ако (грешка) {
      връщане следващ (грешка);
    }
    ако (! публикация) {
      var notFound = нова грешка ('Публикуването не е намерено!');
      notFound.status = 404;
      връщане следващ (notFound);
    }
    res.send (пост);
  });
});

Тук обработваме GET заявка по пътя / публикацията. В обратния разговор изглежда, че правим някакво повикване към Post.findById, което вероятно е заявка към базата данни. Тъй като това включва достигане до база данни и връщане на обещание - което е ясно от използването на .then - нека погледнем вътре в тази функция. Конкретно виждаме, че ако (грешка) е истина, се отправя призив за връщане следващ (грешка). След това имаме друг if (! Post), който отново върне следващия (notFound), и накрая, ако не получихме грешка и post има някакви данни в него, се обаждаме на res.send (post), който изпраща резултата на заявката към базата данни обратно към браузъра.

В други примери бих видял нещо подобно.

app.get ( "/ Фу ',
функция проверкаРегистрация (req, res, next) {
  ако (! req.user.registered) {
    // Ако потребителят не се е регистрирал, преминете към следващия маршрут.
    // getRegistration няма да бъде изпълнен.
    Следващата ( "маршрут")
  }
}, функция getRegistration (req, res, next) {
  Registration.find (функция (грешка, данни) {
    ако (грешка) се върне следващата (грешка)
    res.json (данни)
  });
});

В този пример ние просто се обаждаме към следващия („маршрут“). Така че естественият въпрос е каква е разликата между използването на връщане или не?

Оказва се, както открих днес, че повикването до next () вътре в маршрута НЕ веднага напуска функцията и продължава към следващия маршрут. В този случай останалата част от маршрута се оценява и тъй като следващият () е извикан, няма нужда да разрешаваме заявката и можем просто да преминем към следващия съвпадащ манипулатор на маршрута.

Бързо настрана: не забравяйте, че ако не разрешите заявката в рамките на маршрут, Express няма да изпрати нищо обратно в браузъра и ще останете да виси.

Така че, обаждането на next () отвътре в маршрута просто казва на Express, че трябва да продължи с останалата част от маршрута и след това да премине към следващия съвпадащ маршрут.

Контрастирайте това с повикване за връщане next () от маршрута. Съществената разлика е, че когато извикате return next (), изпълнението веднага напуска функцията и преминава към следващия съвпадащ маршрут. Това е подобно на поведението на хвърляне на изключение. Нещо се е случило в нашия маршрут и искаме да пропуснем всеки останал код в маршрута и просто да преминем към следващия съвпадащ маршрут.

Проблемът ми днес беше в опитите да стартирам заявка до MongoDB, където всичките ми потребителски имена и пароли се съхраняват за моето приложение. Когато стигнах до POST заявката, която получи потребителското име и паролата, които клиентът току-що беше изпратил, трябва да пусна заявка, за да видя дали има съвпадение на записа в базата данни. Това е асинхронен разговор с функция за обратно извикване. Що се отнася до Express, той продължава да изпълнява кода ми, докато чака резултата да се върне от базата данни.

Оказва се, че това е лошо за мен. Тъй като Express чака данни да се върнат от базата данни, изпълнението продължава и започвам да виждам това съобщение за грешка.

Грешка: Не могат да се задават заглавки след изпращането им.

Това Експрес продължава, когато наистина не исках. Използвах next (), когато наистина исках да използвам return next ().

Осъзнаването на това днес беше огромно за мен. Хубаво е да завършите отворения цикъл от преди няколко дни, като се чудите каква е разликата в двете обаждания. Вече мога да се върна и да изчистя кода си за този проект.

И последно нещо - новият седмичен проект беше пуснат днес. Трябва да кодираме уеб страница, която ви позволява да играете на класическата игра на Hangman. Ще се справя с този уикенд! :-)