首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Node.js中跟踪HTTP重定向?

如何在Node.js中跟踪HTTP重定向?
EN

Stack Overflow用户
提问于 2011-09-07 01:42:52
回答 5查看 127.4K关注 0票数 104

我想在node中打开一个页面,并处理应用程序中的内容。像这样的东西似乎工作得很好:

代码语言:javascript
复制
var opts = {host: host, path:pathname, port: 80};
http.get(opts, function(res) {
  var page = '';
  res.on('data', function (chunk) {
    page += chunk;
  });
  res.on('end', function() {
     // process page
  });

但是,如果页面返回301/302重定向,这将不起作用。在有多个重定向的情况下,我如何以可重用的方式做到这一点?在http的顶部是否有一个包装器模块,可以更轻松地处理来自节点应用程序的http响应?

EN

回答 5

Stack Overflow用户

发布于 2012-11-15 09:25:56

如果你想做的就是遵循重定向,但仍然想使用内置的HTTP和HTTPS模块,我建议你使用https://github.com/follow-redirects/follow-redirects

代码语言:javascript
复制
yarn add follow-redirects
npm install follow-redirects

你所需要做的就是替换:

代码语言:javascript
复制
var http = require('http');

使用

代码语言:javascript
复制
var http = require('follow-redirects').http;

..。你的所有请求都会自动跟随重定向。

使用TypeScript,您还可以安装类型

代码语言:javascript
复制
npm install @types/follow-redirects

然后使用

代码语言:javascript
复制
import { http, https } from 'follow-redirects';

披露:这个模块是我写的。

票数 129
EN

Stack Overflow用户

发布于 2017-08-20 09:46:34

基于response.headers.location发出另一个请求

代码语言:javascript
复制
      const request = function(url) {
        lib.get(url, (response) => {
          var body = [];
          if (response.statusCode == 302) {
            body = [];
            request(response.headers.location);
          } else {
            response.on("data", /*...*/);
            response.on("end", /*...*/);
          };
        } ).on("error", /*...*/);
      };
      request(url);
票数 25
EN

Stack Overflow用户

发布于 2020-06-26 13:34:04

这是我使用普通节点下载JSON的(递归)方法,不需要包。

代码语言:javascript
复制
import https from "https";

function get(url, resolve, reject) {
  https.get(url, (res) => {
    // if any other status codes are returned, those needed to be added here
    if(res.statusCode === 301 || res.statusCode === 302) {
      return get(res.headers.location, resolve, reject)
    }

    let body = [];

    res.on("data", (chunk) => {
      body.push(chunk);
    });

    res.on("end", () => {
      try {
        // remove JSON.parse(...) for plain data
        resolve(JSON.parse(Buffer.concat(body).toString()));
      } catch (err) {
        reject(err);
      }
    });
  });
}

async function getData(url) {
  return new Promise((resolve, reject) => get(url, resolve, reject));
}

// call
getData("some-url-with-redirect").then((r) => console.log(r));
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7323932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档