繁体   English   中英

为什么异步/等待功能运行两次?

[英]Why does async / await function run twice?

我正在使用expressnode.js应用程序。 我有一个普通的路由器,它:

  • DB找到myID
  • 如果myID存在,它会尝试addVisit()
  • 如果发生错误(该表可能不存在),它将捕获该错误,创建新表并将其addVisit()addVisit()

路由器代码如下:

    router.get('/:myId', errorHandler(async (req, res, next) => {

    console.log(req.params.myId + ' This is myID Params!');

    const Domain = DomainModel(db, Sequelize);
    const Click = ClickModel(db, `${req.params.myId}_clicks`, Sequelize);

    try {
        let row = await Domain.findOne({ where: { myId: req.params.myId } });

        console.log(row.myId + ' This is myID from DB');

        if (row.myId) {
            try {
                await addVisit(Click, req);
                res.sendStatus(200);
            } catch (err) {
                console.log(`This error fires!`);
                if (err.message !== `Validation error`) {
                    try {
                        await db.sync();
                        await addVisit(Click, req);
                        res.sendStatus(200);
                    } catch (err) {
                        console.log(err);
                        res.sendStatus(400);
                    }
                } else {
                    res.sendStatus(400);
                }
            }
        } else {
            console.log(`No such myId in use`);
            res.sendStatus(400);
        }
    } catch (err) {
        console.log(err);
    }
})

但是代码运行两次! 我的console.log()显示:

1. ==> 1231231231 This is myID Params!
2. ==> 1231231231 This is myID from DB
3. ==> This error fires!
4. ==> favicon.ico This is myID Params!
5. ==> TypeError: Cannot read property 'myID' of null

如果我注释这部分代码,它将只运行一次!

// if (err.message !== `Validation error`) {
//    try {
//        await db.sync();
//        await addVisit(Click, req);
//        res.sendStatus(200);
//    } catch (err) {
//        console.log(err);
//        res.sendStatus(400);
//    }
// } else {
//    res.sendStatus(400);
// }

这是我使用console.log()的唯一地方! 这是一个简单的示例项目,在其中可以重现该行为。 那么为什么代码会运行两次,为什么我的params.myID变成了favicon.ico?

每当您打开网页时,选项卡的左上角都会有一个小图标,其中包含该页面的徽标。 该图标将从theserver/favicon.ico加载,如果返回错误,则该图标将保持空白,否则将其返回的照片用作该图标。 还有其他此类保留文件,例如norobots.txtmanifest.json 因此,在主级别上具有可变的url部分是一个坏主意。 这个:

 router.get('/:myId'

抓住一切。 相反,您应该将其移动到子路径:

 router.get('/id/:myId'

因为使用路由参数/:myId您也将提供/favicon请求。 这就是两个请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM