我的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) {
// ...
});
});
答案 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) {
// ...
});
});
这样做的好处是可以在多个端点上重用中间件 希望这有帮助。