node.js 中的 Rest api 调用问题

兔子

我使用 Express Generator 创建了一个 nodejs express 应用程序。

在其路由 index.js 中,我尝试使用标准库https://nodejs.org/api/http.html#http_http_get_options_callback中的默认 HTTP 模块进行 rest api 调用(我不想安装外部依赖项)和这将在视图中提供标题和欢迎文本的值。下面是 index.js 的代码。

var express = require('express');
var router = express.Router();
const http = require('http');


/* GET home page. */
router.get('/', function(req, res, next) {
  let titletext = '';
  let wtext = '';
  http.get('http://localhost:5000/api/values', (apires) => {
    const { statusCode } = apires;
    const contentType = apires.headers['content-type'];

    let error;
    if (statusCode !== 200) {
      error = new Error('Request Failed.\n' +
                        `Status Code: ${statusCode}`);
    } else if (!/^application\/json/.test(contentType)) {
      error = new Error('Invalid content-type.\n' +
                        `Expected application/json but received ${contentType}`);
    }
    if (error) {
      console.error(error.message);
      // Consume response data to free up memory
      apires.resume();
      return;
    }

    apires.setEncoding('utf8');
    let rawData = '';
    apires.on('data', (chunk) => { rawData += chunk; });
    apires.on('end', () => {
      try {
        const parsedData = JSON.parse(rawData);
        console.log(parsedData);
        titletext=parsedData[1];
        wtext=parsedData[0];
      } catch (e) {
        console.error(e.message);
      }
    });
  }).on('error', (e) => {
    console.error(`Got error: ${e.message}`);
  });


  res.render('index', { title: titletext, data:wtext });
});

module.exports = router;

但它似乎不起作用,并且 titletext 和 wtest 以空字符串的形式出现。所以,我添加了三个断点。一个就在 get 调用之后,第二个在 get 调用响应到来之后,最后一个页面响应呈现调用(res.render)在最后。

现在,当我运行时,我发现调用了 get 调用断点,然后调用了页面响应渲染调用断点,最后调用了 get 调用响应断点,数据来自其余 api 但到那时页面渲染调用已经over,所以来自 api 调用的数据没有到达视图。

任何解决这个问题的想法都非常感谢

清藩

Http 请求调用是异步的,所以如果你把它放在res.renderGET 处理程序的末尾,它会在请求返回响应之前呈现空数据。

按照文档,您应该解析响应的正文并从end事件处理程序呈现页面,例如:

router.get('/', function(req, res, next) {
  let titletext = '';
  let wtext = '';
  http.get('http://localhost:5000/api/values', (apires) => {
    const { statusCode } = apires;
    const contentType = apires.headers['content-type'];

    let error;
    if (statusCode !== 200) {
      error = new Error('Request Failed.\n' +
                        `Status Code: ${statusCode}`);
    } else if (!/^application\/json/.test(contentType)) {
      error = new Error('Invalid content-type.\n' +
                        `Expected application/json but received ${contentType}`);
    }
    if (error) {
      console.error(error.message);
      // Consume response data to free up memory
      apires.resume();
      return;
    }

    apires.setEncoding('utf8');
    let rawData = '';
    apires.on('data', (chunk) => { rawData += chunk; });
    apires.on('end', () => {
      try {
        const parsedData = JSON.parse(rawData);
        console.log(parsedData);
        titletext=parsedData[1];
        wtext=parsedData[0];

        // Render page here
        res.render('index', { title: titletext, data:wtext });
      } catch (e) {
        console.error(e.message);
      }
    });
  }).on('error', (e) => {
    console.error(`Got error: ${e.message}`);
  });


  // Not here
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章