【问题标题】:Return data instead of promise from node从节点返回数据而不是承诺
【发布时间】: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)行,否则如果出现错误,你会同时调用rejectresolve这可能会导致奇怪发生的事情......另外我建议在你的console.log 语句中添加一些静态参数(数字),这样你就可以确定是哪个被解雇了。
  • "当我在客户端记录此响应时,我可以看到承诺值中的数据" - 如果这是您的实际问题,请向我们展示您记录的客户端代码回复。似乎您也在那里使用了 Promise - 但这些与您服务器上的 Promise 链无关。这是一个在从服务器接收到 http 响应时解析的承诺,无论其实现如何。
  • @MartinAdámek 调用两者不会导致奇怪的事情发生,promise 只能解决一次。但是,是的,elsereturn 会更好。

标签: node.js express promise


【解决方案1】:

感谢@Bergi 的评论,我仔细检查了我的客户端代码,问题确实来自那里。

我改变了

fetch(connectHelper,{
  method: 'POST',
  body: authCode,
}).then(res => {
  console.log(res.json())
})

fetch(
  connectHelper,
  {
    method: 'POST',
    body: authCode,
  }).then(res => {
    res.json()
    .then(data => ({data:data}))
    .then(res => {
       console.log(res.data)
  })
})

它现在记录对象而不是承诺!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 2016-02-21
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多