【问题标题】:Google Cloud Functions req/res with Promise by node-fetchGoogle Cloud Functions req/res with Promise by node-fetch
【发布时间】:2020-08-06 00:22:08
【问题描述】:

我是 Javascript 的新手,并试图在我使用的两种服务之间架起一座桥梁。目标只是获取正文或请求,对另一个服务进行承诺 api 调用,以响应该 api 调用的正文。我已经能够获取请求的主体并将其发送到服务,但是我无法接收该响应并将该响应的主体作为函数的响应。请帮帮我。谢谢。

var moment = require('moment');
var CryptoJS = require("crypto-js");
const fetch = require('node-fetch');

var unixtime = moment().unix();
var apiUser = process.env.apiUser;
var secret = process.env.apiKey;
var url = process.env.url;

exports.test = (req, res) => {
  var message = req.body;
  message = JSON.stringify(message);
  var body = "{\n    \"ops\": [{\n        \"conv_id\": \"679690\",\n        \"type\": \"create\",\n        \"obj\": \"task\",\n        \"data\": message\n    }]\n}\n"
  body = body.replace(/message/ig, message);
  var signature = CryptoJS.enc.Hex.stringify(CryptoJS.SHA1(unixtime + secret + body + secret));

  function request1() {
    return new Promise((resolve, reject) => {

      var options = fetch(url+apiUser+'/'+unixtime+'/'+signature, {
          method: 'post',
          body: body,
          headers: { 'Content-Type': 'application/json' },
      });

      options.then(res => {
          var result = res.json;
          console.log(result);
          resolve(result);
        })
        .catch(() => { // if .then fails
          console.log('Promise rejected');
          let rejectMessage = 'Sorry, an error occurred.';
          reject(rejectMessage); // Promise rejected
        });
    });
  }

  request1();
};

【问题讨论】:

  • 所以你只想作为响应发送result 对象(在选项承诺内)?
  • 是的。更具体地说是 result.body.ops.data

标签: javascript node.js promise google-cloud-functions node-fetch


【解决方案1】:

您可以轻松检索 result 对象,因为函数 request1 返回解析该对象的承诺,因此应该可以:

request1().then((resultObject)=>{
    //resultObject === result
    return res.send(resultObject);
});

另外,res.json() 返回一个承诺,所以你应该这样做:

options.then(res => res.json()).then(result => {
          console.log(result);
          resolve(result);
        })

【讨论】:

  • 导致超时,因为它不知道 resultObject 是什么 - 那里有什么?
  • 抱歉,如果您想将该对象作为响应发送,您可以使用return res.send(resultObject);
  • 所以输出是空的,而当前代码应该是json,因为我有console.log(result);,它记录了json
  • 非常感谢!像魅力一样工作!您能否也告诉我res => res.json()) 的确切位置我需要指定我想要返回的响应正文的哪一部分?谢谢
  • 是的,res.json()fetch 函数的响应转换为 JSON 对象 akynchrounsly,这就是为什么您必须再次调用 .then
猜你喜欢
  • 2015-12-24
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多