【发布时间】:2018-10-18 18:24:36
【问题描述】:
我是 node 新手,刚开始构建我的第一个后端服务。
我在这里尝试做的非常简单,我从客户端获得了一个身份验证代码,并将使用此数据从条带 API 获取帐户信息,然后将其发送回客户端以供进一步使用。
问题是,我得到的响应始终是已解决的承诺而不是承诺值,当我在客户端记录此响应时,我可以看到承诺值中的数据,我怎样才能获得该数据?
这是代码
const app2 = express();
app2.use(cors({ origin: true }));
app2.post('/', (req, res) => {
let options = {
url: 'https://connect.stripe.com/oauth/token',
method: 'POST',
body:req.body
};
function fetchToken(opt) {
return new Promise((resolve, reject) => {
request(opt,(err, tokenRes, body) => {
if(err){
reject(err);
}
resolve(body) ;
})
})
}
fetchToken(options).then(data => {
console.log(data)
return(res.send(data));
}).catch(e => console.log(e))
}
exports.connectHelper = functions.https.onRequest(app2);
据我了解,承诺工作正常, res.send() 确实等待承诺。但是为什么它仍然发送了承诺?更让我困惑的是,res.send(data) 正上方的console.log(data) 确实在云功能日志查看器中记录了正确的帐户信息。
这是我的客户端代码,非常简单
fetch(connectHelper,{
method: 'POST',
body: authCode,
}).then(res => {
console.log(res.json())
})
【问题讨论】:
-
可能不是问题,但你一定要把
return添加到reject(err)行,否则如果出现错误,你会同时调用reject和resolve这可能会导致奇怪发生的事情......另外我建议在你的console.log语句中添加一些静态参数(数字),这样你就可以确定是哪个被解雇了。 -
"当我在客户端记录此响应时,我可以看到承诺值中的数据" - 如果这是您的实际问题,请向我们展示您记录的客户端代码回复。似乎您也在那里使用了 Promise - 但这些与您服务器上的 Promise 链无关。这是一个在从服务器接收到 http 响应时解析的承诺,无论其实现如何。
-
@MartinAdámek 调用两者不会导致奇怪的事情发生,promise 只能解决一次。但是,是的,
else或return会更好。