Fetch and post text in NodeJS

独自空忆成欢 提交于 2019-12-08 05:22:39

问题


I'm trying to grab text from an API that only returns a string of text ((here)) and having troubles throwing that out in a response. When posting, it comes out as [object Response], and the console.log doesn't show the text I want out of it.

The code I'm using:

fetch('http://taskinoz.com/gdq/api').then(
    function(response) {
      console.log(response);
      throttledSendMessage(channel, response);
      return response;
    })
  .catch(function(error) {
    throttledSendMessage(channel, "An error has occured");
  })

Log can be found here

Thanks for looking with me, couldn't find a solution :/


回答1:


Probably the problem is in async behavior of node.js. You can read more here
Also, I'm assume you use this package to make fetch request in node.js.
And assume that throttledSendMessage function is synchronous.

About your problem, just try to rewrite co de to use async/await for cleaner solution.

// We'll use IIFE function
(async () => {
    const fetchResult = await fetch('http://taskinoz.com/gdq/api')
    // Here fetch return the promise, so we need to await it again and parse according to our needs. So, the result code would be this
    const data = await fetchResult.text();
    throttledSendMessage(channel, data);
    return data;
})()



回答2:


I think that because fetch returns a Response you need to call one of the functions on Response in order to get at the body's text. Here's an example:

fetch('https://github.com/')
  .then(res => res.text())
  .then(body => console.log(body));



回答3:


Fetch is not available in nodejs , you could use the node-fetch https://www.npmjs.com/package/node-fetch , or you could use this fetch function:

const https = require('https');
const http = require('http');

function fetch(url, options = {}) {
  return new Promise((resolve, reject) => {
    if (!url) return reject(new Error('Url is required'));

    const { body, method = 'GET', ...restOptions } = options;
    const client = url.startsWith('https') ? https : http;

    const request = client.request(url, { method, ...restOptions }, (res) => {
      let chunks = '';

      res.setEncoding('utf8');

      res.on('data', (chunk) => {
        chunks += chunk;
      });

      res.on('end', () => {
        resolve({ statusCode: res.statusCode, body: chunks });
      });
    });

    request.on('error', (err) => {
      reject(err);
    });

    if (body) {
      request.setHeader('Content-Length', body.length);
      request.write(body);
    }

    request.end();
  });
}

module.exports = fetch;

you could use it like this inside your code :

  const result = await fetch(
    `https://YOUR_URL`,
    {
      method: 'PUT',
      body: JSON.stringify({ test: 'This is just a test', prio: 1 }),
    },
  );


来源:https://stackoverflow.com/questions/51070032/fetch-and-post-text-in-nodejs

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!