Почему асинхронная / ожидающая функция запускается дважды? - PullRequest
0 голосов
/ 10 ноября 2018

Я работаю с приложениями express и node.js.У меня есть обычный маршрутизатор, который:

  • находит myID в DB,
  • , если существует myID, он пытается 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?

Ответы [ 2 ]

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

Каждый раз, когда вы открываете веб-страницу, в верхнем левом углу вкладки появляется небольшой значок, содержащий логотип страницы. Этот значок загружается из theserver/favicon.ico, если возвращается ошибка, значок остается пустым, в противном случае фотография, возвращаемая этим, используется в качестве значка. Существуют и другие такие зарезервированные файлы, такие как norobots.txt и manifest.json. Поэтому плохая идея иметь переменную часть URL на главном уровне. Вот этот:

 router.get('/:myId'

ловит все. Вместо этого вы должны переместить его в подпуть:

 router.get('/id/:myId'
0 голосов
/ 10 ноября 2018

Потому что с параметром маршрута /:myId вы также будете обрабатывать запрос /favicon. Так что это 2 запроса.

...