Express:将方法的响应传递给同一帖子中的另一个方法

时间:2017-01-28 14:25:50

标签: javascript node.js express

我的app.post中有两个子部分,第一部分返回一个名为 customToken 的字符串,我希望将其作为参数传递给第二部分。
有人能提醒我哪里弄错了吗?
我收到错误发送后无法设置标头。

app.post('/.custom-token', function (req, res, nex) {
    var token = null;

    //part ONE
    admin.auth().createCustomToken(req.body.uid)
        .then(function(customToken) {
            console.log("Successfully created custom-token:", customToken);
            res.status(200).send({token: customToken});
            nex();
            return token = res.status(200).send({token: customToken});
        })
    .catch(function(error) {
        console.log("Error creating custom token:", error);
        res.status(400).send({error: error})

    });

    //part TWO: i need to pass in the token generated above
    firebase.auth().signInWithCustomToken(token)
        .then(function (firebaseUser) {
            //...
        })
        .catch(function(error) {                       
            // ...
        });
});

2 个答案:

答案 0 :(得分:2)

你可以通过承诺链来实现这个目标

 app.post('/.custom-token', function (req, res, nex) {
    var token = null;

    //part ONE
    admin.auth().createCustomToken(req.body.uid)
        .then(function(customToken) {
            console.log("Successfully created custom-token:", customToken);
            return customToken;
        })
        .then(function(token){
             // token returned in the last promise will be available here in token parameter
            return firebase.auth().signInWithCustomToken(token)
        })
        .then(function(firebaseUser){
                //....
                //here you can send response back
                return res.status(200).send();
        })
        .catch(function(error) {
            console.log("Error creating custom token:", error);
            res.status(400).send({error: error})

        });
});

代码中的第二部分将在不等待第一部分的响应的情况下运行,因为异步因此对于代码的第二部分,token将为null。

答案 1 :(得分:1)

您可以使用中间件,具体如下:

const getUserToken = (req, res, next) => {
    admin.auth().createCustomToken(req.body.uid)
        .then(function(customToken) {
            console.log("Successfully created custom-token:", customToken);
            req.cutomToken = customToken;

        //Here will pass the control to the next handler
            next();

        })
    .catch(function(error) {
        console.log("Error creating custom token:", error);
        res.status(400).send({error: error});
        res.end();
    });
});

您可以在此处使用中间件

app.post('/.custom-token',getUserToken ,function (req, res, next) {
     const token = req.cutomToken;
     firebase.auth().signInWithCustomToken(token)
        .then(function (firebaseUser) {
            //...
        })
        .catch(function(error) {                       
            // ...
        });
});

这样做的好处是可以在多个端点上重用中间件 希望这有帮助。