next()在此Express路由中做什么,为什么它在代码中的顺序很重要?

时间:2018-11-01 02:00:58

标签: node.js express

我对next();感到困惑,我通读了这个post,它实际上说它将控制权传递给下一条路线。在下面的代码中,将next();放在其中会导致我得到“将标头发送到客户端后无法设置标头”。但是,如果我将其注释掉,然后恢复我的if语句的else子句,则在传递不正确的empID以及传递正确的empID时,它都可以正常运行。我希望有人能够解释到底发生了什么?为什么next()的位置很重要?似乎会以任何一种方式调用它?

我正在尝试执行此post中发生的事情,这可以为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 :(得分:0)

看起来db.get()可能是异步的,因此在所示示例中,next()将在db.get()完成之前被调用,然后移至下一个处理程序。然后,db.get()完成后,它将尝试发送响应,但是响应已由主处理程序中的匿名函数发送。通过将next()移到db.get()内,您实际上是在等待其完成才继续前进。