Как передать переменную из одного маршрута в другой в express - js - PullRequest
0 голосов
/ 23 апреля 2020

Я работаю с npm disco-oauth (для аутентификации с разногласиями), и когда я аутентифицируюсь в приложении. js (основной файл) я сохраняю userKey в cook ie (используя cook ie -parser), чтобы я мог получить некоторую информацию о пользователе, а также о гильдиях, в которых он находится. Но затем я хочу, чтобы информация об этом пользователе и отфильтрованной гильдии передавалась в файл маршрутов (где я обрабатываю маршруты панели инструментов), и мне нужно чтобы сделать некоторые проверки, и эти переменные будут очень полезны, когда я захочу (я не хочу использовать запросы и другой метод, который использует URL для передачи информации, потому что она не выглядит хорошо).

Проблема в том, что я пытался дать cookieParser объект, подобный этому:

app.get('/auth/discord', (req, res) => {
        if (req.cookies.userConfig.userKey) res.redirect('/guilds');
        else res.redirect(oauthClient.authCodeLink);
    })

    app.get('/login', async (req, res) => {
        try {
            let userKey = await oauthClient.getAccess(req.query.code);
            let userConfig = {
               userKey: userKey,
               userID: " ",
               guilds: Guilds[]
            }
            await res.cookie('userConfig', userConfig);
            await res.redirect('/guilds');
        } catch (err) {
            res.render('error', {
                message: err.message,
                error: err
            });
        }
    });

    app.get('/logout', (req, res) => {
        res.clearCookie("userConfig")
        res.redirect('/')
    })

    app.get('/guilds', async (req, res) => {
        if (!req.cookies.userConfig.userKey) res.redirect('/');
        else {
            try {
                let user = await oauthClient.getUser(req.cookies.userConfig.userKey);
                let GUILDS = await oauthClient.getGuilds(req.cookies.userConfig.userKey)



                var Guilds = []
                await GUILDS.forEach(async g => {
                    if (g.permissions.includes("MANAGE_GUILD")) {
                        await Guilds.push(g)
                    }
                })
                 //edit the cookie here to import the user and guilds values
                await res.render('guilds', {
                    user, //this is the user I want to pass
                    Guilds, //This is the guilds I want to pass
                    Servers: client.guilds.cache,
                    AdminIDs: keys.admin.discord_ids
                });

            } catch (err) {
                console.log(err)
                res.render('error', {
                    message: err.message,
                    error: err
                });
            }
        }
    })

Дело в том, что новый повар ie obj всегда возвращает "не может прочитать свойство userKey of undefined", но я не понимаю почему это работает, когда я передаю только userKey и когда я пытаюсь поместить полный объект (даже если у него есть только userKey и пустой user и гильдии), он не работает. У повара ie есть какие-то ограничения или я делаю это неправильно? Пожалуйста, помогите

Если эта первая часть не работает, я даже не хочу пытаться редактировать повар ie (см. Комментарий в коде), а затем захватить этот повар ie и использовать его в других файлах. и маршруты

ПОСЛЕДНЯЯ РАБОЧАЯ ВЕРСИЯ

app.get('/auth/discord', (req, res) => {
        if (req.cookies.userKey) res.redirect('/guilds');
        else res.redirect(oauthClient.authCodeLink);
    })

    app.get('/login', async (req, res) => {
        try {
            let userKey = await oauthClient.getAccess(req.query.code);
            await res.cookie('userKey', userKey);
            await res.redirect('/guilds');
        } catch (err) {
            res.render('error', {
                message: err.message,
                error: err
            });
        }
    });

    app.get('/logout', (req, res) => {
        res.clearCookie("userKey")
        res.redirect('/')
    })

    app.get('/guilds', async (req, res) => {
        if (!req.cookies.userKey) res.redirect('/');
        else {
            try {
                let user = await oauthClient.getUser(req.cookies.userKey);
                let GUILDS = await oauthClient.getGuilds(req.cookies.userKey)



                var Guilds = []
                await GUILDS.forEach(async g => {
                    if (g.permissions.includes("MANAGE_GUILD")) {
                        await Guilds.push(g)
                    }
                })

                await res.render('guilds', {
                    user,
                    Guilds,
                    Servers: client.guilds.cache,
                    AdminIDs: keys.admin.discord_ids
                });

            } catch (err) {
                console.log(err)
                res.render('error', {
                    message: err.message,
                    error: err
                });
            }
        }
    })

1 Ответ

0 голосов
/ 23 апреля 2020

Cookies - это пары ключ-значение, разделенные ;. Вы можете прочитать больше о них здесь: https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies

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

Чтобы устранить неполадки, добавьте точки останова в вашем отладчике или console.log значения req.cookies и req.headers, чтобы увидеть, что возвращается.

Может оказаться ошибкой или неучтением крайнего случая в cookieParser.

...