Что next () делает на этом маршруте Express и почему важен его порядок в коде? - PullRequest
0 голосов
/ 01 ноября 2018

Я запутался с next(); Я прочитал этот пост , который, по сути, говорит, что передает управление следующему маршруту. В моем коде ниже наличие next();, где оно находится, заставляет меня получить «Невозможно установить заголовки после того, как они отправлены клиенту». Однако, если я закомментирую это, а затем восстановлю предложение else в моем операторе if, он будет работать правильно как при передаче неверного empID, так и при правильном. Я надеюсь, что кто-то может объяснить, что именно происходит? Почему положение next() имеет значение? Кажется, это будет так или иначе?

Я пытаюсь сделать то, что происходит в этом посте , который добавляет значение, скажем, req.user, но я не смог заставить это работать вообще, поэтому я ' Я пытаюсь метод, который я здесь.

let checkEmp = (req, res, next) => {
    db.get("select * from Employee where id = $id", {$id: req.empID},
        (err, row) => {
            if (err || row === undefined) {
                res.status(404).send();
            // } else {
            //     next();
            }
        });
    next();
};

// get all timesheets
timesheetRouter.get("/", getParams, checkEmp, (req, res, next) => {
    if (req.empID) {
        db.all("select * from Timesheet where employee_id = $id", {$id: req.empID},
            (err, rows) => {
                if (err) {
                    next(err);
                } else {
                    return res.status(200).send({timesheets: rows});
                }
            });
    } else {
        return res.status(404).send("Nothing to see here");
    }
});

1 Ответ

0 голосов
/ 01 ноября 2018

Похоже, что db.get(), вероятно, асинхронно, поэтому в показанном примере next() будет вызван до завершения db.get() и перейдет к следующему обработчику. Затем, когда db.get() завершается, он пытается отправить ответ, но ответ уже был отправлен анонимной функцией в главном обработчике. Перемещая next() внутрь db.get(), вы, по сути, ждете его окончания, прежде чем двигаться дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...