Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript express nodejs web服务中的服务器响应为空_Javascript_Node.js_Express_Promise - Fatal编程技术网

Javascript express nodejs web服务中的服务器响应为空

Javascript express nodejs web服务中的服务器响应为空,javascript,node.js,express,promise,Javascript,Node.js,Express,Promise,您好,我在express rest Web服务上工作。我正在使用请求承诺调用一个url,我希望处理响应并返回到客户端 但我看到它总是返回空的响应。我在做什么?我使用rp调试了调用webservice的响应,该响应返回良好 const express = require("express"); const router = express.Router(); var rp = require("request-promise"); const cheerio = require("cheerio"

您好,我在express rest Web服务上工作。我正在使用
请求承诺
调用一个url,我希望处理响应并返回到客户端

但我看到它总是返回空的响应。我在做什么?我使用
rp
调试了调用webservice的响应,该响应返回良好

const express = require("express");
const router = express.Router();
var rp = require("request-promise");
const cheerio = require("cheerio");
const { rollbar } = require("../config/rollbar");
const { baseUrl } = require("../config/settings");

/** API to get all currency price */
router.get("/:ticker?", function(req, res, next) {
  var currencyList = [];

  // it can be null as ticker is optional parameter
  let reqCurrencyName = req.params.ticker;

  const promise = Promise.resolve(
    rp(baseUrl, function(error, response, body) {
      // if no error and http response code is 200
      if (!error && response.statusCode == 200) {
        const $ = cheerio.load(body);
        $("tr").each(function name(i, elem) {
          // currency name
          var currencyName = $(this)
            .find("td")
            .eq(1)
            .text()
            .replace(/\r?\n|\r/g, " ")
            .trim();

          // market cap value
          var marketCap = $(this)
            .find("td")
            .eq(2)
            .text()
            .replace(/\r?\n|\r/g, " ")
            .trim();

          // currency price
          var price = $(this)
            .find("td")
            .eq(3)
            .text()
            .replace(/\r?\n|\r/g, " ")
            .trim();

          // date supply value
          var dataSupply = $(this)
            .find("td")
            .eq(4)
            .text()
            .replace(/\r?\n|\r/g, " ")
            .trim()
            .replace(/ /g, "");

          // volume value
          var volume = $(this)
            .find("td")
            .eq(5)
            .text()
            .replace(/\r?\n|\r/g, " ")
            .trim();

          // negative change value
          var negativeChange = $(this)
            .find("td")
            .eq(6)
            .text()
            .replace(/\r?\n|\r/g, " ")
            .trim();

          // first item is empty in response so lets not push it into an array
          if (currencyName !== "") {
            if (reqCurrencyName !== undefined) {
              if (currencyName === reqCurrencyName) {
                const currencyItem = {
                  currencyName: currencyName,
                  marketCap: marketCap,
                  price: price,
                  dataSupply: dataSupply,
                  volume: volume,
                  negativeChange: negativeChange
                };

                currencyList.push(currencyItem);
              }
            } else {
              const currencyItem = {
                currencyName: currencyName,
                marketCap: marketCap,
                price: price,
                dataSupply: dataSupply,
                volume: volume,
                negativeChange: negativeChange
              };

              currencyList.push(currencyItem);
            }
          }
        });
      } else rollbar.rollbar.l(error);
    })
  );

  Promise.all(promise).then(data => {
    res.send(data);
  });
});

module.exports = router;

请求承诺
返回一个承诺,您不应该使用回调来获取异步调用的结果。您不应该使用
promise.resolve
创建已履行的承诺,相反,您需要从
rp
创建一个承诺链,然后使用
然后使用
回调来获得结果,并使用
catch
回调来处理可能的错误

您只执行一个异步操作,
Promise。所有的
都不需要

const express = require("express");
const router = express.Router();
var rp = require("request-promise");
const cheerio = require("cheerio");
const { rollbar } = require("../config/rollbar");
const { baseUrl } = require("../config/settings");

/** API to get all currency price */
router.get("/:ticker?", (req, res, next) => {
  var currencyList = [];

  // it can be null as ticker is optional parameter
  let reqCurrencyName = req.params.ticker;

  rp(baseUrl)
    .then(body => {
      const $ = cheerio.load(body);
      // Ppocessing...
    })
    .then(data => res.send(data))
    .catch(err => {
      rollbar.rollbar.l(err);
      res.send({ error: err })
    });
});

module.exports = router;

顺便说一句,默认情况下,如果响应状态不是2xx,
请求承诺
将抛出错误。因此,您不应该在代码中验证响应状态。

请求承诺
返回承诺,您不应该使用回调来获取异步调用的结果。您不应该使用
promise.resolve
创建已履行的承诺,相反,您需要从
rp
创建一个承诺链,然后使用
然后使用
回调来获得结果,并使用
catch
回调来处理可能的错误

您只执行一个异步操作,
Promise。所有的
都不需要

const express = require("express");
const router = express.Router();
var rp = require("request-promise");
const cheerio = require("cheerio");
const { rollbar } = require("../config/rollbar");
const { baseUrl } = require("../config/settings");

/** API to get all currency price */
router.get("/:ticker?", (req, res, next) => {
  var currencyList = [];

  // it can be null as ticker is optional parameter
  let reqCurrencyName = req.params.ticker;

  rp(baseUrl)
    .then(body => {
      const $ = cheerio.load(body);
      // Ppocessing...
    })
    .then(data => res.send(data))
    .catch(err => {
      rollbar.rollbar.l(err);
      res.send({ error: err })
    });
});

module.exports = router;

顺便说一句,默认情况下,如果响应状态不是2xx,
请求承诺
将抛出错误。因此,您不应该在代码中验证响应状态。

我应该在哪里使用
Promise.resolve
Promise.all
?当您要等待多个承诺完成时,您应该使用
Promise.all
Promise.resolve
在您想要创建承诺链时非常有用,并且链中第一个运行的函数不是异步的(例如验证函数,它可能会抛出错误)。好的。所以这里它已经为我创建了一个承诺链,对吗?在我的示例中,
rp(baseUrl)
创建了一个承诺链。啊,我明白了。我得到了GET/ticker 304 6798.232 ms--在这里我应该使用
Promise.resolve
Promise.all
?你应该使用
Promise.all
当你想等待多个承诺完成时
Promise.resolve
在您想要创建承诺链时非常有用,并且链中第一个运行的函数不是异步的(例如验证函数,它可能会抛出错误)。好的。所以这里它已经为我创建了一个承诺链,对吗?在我的示例中,
rp(baseUrl)
创建了一个承诺链。啊,我明白了。我得到的是GET/ticker 304 6798.232毫秒--