использование ответа express в пользовательских колбэках Mongoose - PullRequest
0 голосов
/ 11 марта 2020

Я использую Mon goose и Firebase вместе с Express, и с некоторых пор мне все еще нужно go с той же функцией обратного вызова mon goose, но с другими параметрами или после обратного вызова Firebase, я думал использования пользовательского обратного вызова с именем функции. Моя проблема в том, что, поскольку мне нужно отправить ответ в этой функции, мне нужно использовать переменную res из обратного вызова Express, который недоступен. Так как же по-прежнему использовать Express res?

Этот фрагмент кода ниже генерирует ошибку времени выполнения undefined variable res в userCallback (псевдокод). Интересно, как я могу использовать один и тот же код дважды в подобных ситуациях?

function userCallback(err, user) {
    // some other processing
    res.json({});
}

router.get('/:username', function (req, res, next) {
    let idToken = req.header('idToken');
    admin.auth().verifyIdToken(idToken, true)
        .then(function (decodedToken) {
            let email = req.query.email;
            if (!email) {
                User.findOne({
                    username: req.params.username
                }, userCallback);
            } else {
                admin.auth().getUserByEmail(req.params.username).then((user_firebase) => {
                    User.findOne({
                        uid: user_firebase.uid
                    }, userCallback);
                }).catch((error) => {
                    res.json({
                        result: false,
                        error
                    });
                });
            }
        }).catch(function (error) {
            res.json({
                result: false,
                error
            });
        });
});

1 Ответ

1 голос
/ 13 марта 2020

Когда вы используете findOne (), вы должны использовать его обратный вызов (не ваш индивидуальный обратный вызов), который равен

User.findOne({<search_params>}, (err, document)=>{ 
    // this callback is specific to mongoose API and you have to follow the parameters
    // err is the error occurred when running findOne()
    // document is returned document passed back to you by findOne()
    // when your customized callback uses res, it had no knowledge of it in its current scope
})

Причина, по которой вы не можете вернуть res, заключается в том, что res не был передается в ваш настраиваемый обратный вызов в качестве параметра. Таким образом, ваш пользовательский обратный вызов не знает, что res существует! Я предлагаю вместо этого обработать ответ на уровне функции (decodeToken) / вы можете попробовать передать res в свой обратный вызов в качестве последнего параметра, чтобы посмотреть, поможет ли это.

User.findOne({}, (err, document, res){} // Don't think this will work 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...