【问题标题】:Running axios script from localhosted server frontend从本地服务器前端运行 axios 脚本
【发布时间】:2020-04-28 21:59:43
【问题描述】:

我有一个托管在本地主机上的前端。一旦用户在该前端填写了所有数据,他们单击一个按钮,然后启动一个名为 startBot() 的函数,该函数使用 axios。如果我只是使用命令行而不是服务器运行 startBot,则脚本可以完美运行,但是当我使用服务器中的函数时,axios 会使用我的浏览器详细信息来发送信息。这是我的代码: 这是当用户单击按钮运行 startBot() 时运行的函数:


const lodash = require('lodash');
const fuzzyset = require('fuzzyset.js');
var helperFunctions = require("./helperFunctions");

const DELAY = 1500;

const getSupremeProducts = async () => {

    let supremeHome = `?p=${new Date().getTime()}`;

    await helperFunctions.redirectTo(
        supremeHome, 
        DELAY, 
        "Successfully connected to Supreme!", 
        "Error accessing Supreme site, retrying...");

    // direct link to the backend of the site
    let backendLink = "/mobile_stock.json";

    const products = await helperFunctions.redirectTo(
        backendLink, 
        DELAY, 
        "Successfully connected to backend!", 
        "Error accessing Supreme site, retrying...");

    return products.data;
}

这里是 helperFunctions 文件:

const axios = require("axios");
const cheerio = require("cheerio");
const qs = require('qs');

// constants
const RETRY_DELAY = 1000;

axios.defaults.withCredentials = true;

// creating a simple axios session so all cookies are stored throughout the checkout process
const session = axios.create({
    baseURL: `https://www.supremenewyork.com`,
    headers: {
        'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1',
        'x-requested-with': 'XMLHttpRequest',
        'Connection': 'keep-alive'
    }
  });

// timer function for delays
const timer = ms => new Promise( res => setTimeout(res, ms));

// function for simple get requests
const redirectTo = async (redirectLink, delay, successfullMessage, errorMessage) => {

    while(true){

        try{
            const getRedirect = await session.get(redirectLink);

            if(getRedirect.status === 200){
                if(successfullMessage != null){
                    console.log(successfullMessage);
                }
                await timer(delay);
                return getRedirect;
            }

            else {
                console.log(errorMessage)
                await timer(delay);
            }
        }

        catch(err){
            console.log(err);
            await timer(delay);
        }
    }
}

现在,当我在没有服务器的终端中运行 getSupremeProducts() 时,它运行良好,但是从前端运行它会搞砸一切(顺便说一句,我使用的是 webpack,这就是我可以运行节点模块脚本的原因来自 html) 并导致此错误:

非常感谢任何帮助!我只需要弄清楚如何从前端运行此代码,但让 axios 不使用服务器详细信息来运行代码。

【问题讨论】:

    标签: javascript node.js axios frontend backend


    【解决方案1】:

    出于安全原因,浏览器会限制从脚本发起的跨域 HTTP 请求。那是 CORS,您必须更改远程服务器中的 HEADERS 以允许来自您的域和端口的请求。如果您无法控制它,那么有几个选项*。

    • 在服务器允许的域中添加您的本地地址和端口
    • 如果您只是在本地开发并且无法控制服务器,您可以在浏览器上暂时禁用 CORS!
    • 创建一个本地代理服务器,您的前端向代理服务器发出请求,代理服务器向远程服务器发出请求(我通常坚持使用这个,只要确保它具有允许的主机名和端口等的第一点)

    您可以在此处阅读更多信息 (https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)

    【讨论】:

    • 非常感谢您的回答。我正在使用 serve-static 运行我的服务器,它只运行带有 budle.js 和 css 文件的 html。 ------------------------------------- var connect = require('connect'); var serveStatic = require('serve-static'); connect() .use(serveStatic('../frontend')) .listen(8000, () => console.log('Server running on 8000...'));
    • 您的请求将从 botapi.supremenewyork.com:8000 发送至至尊网,它们是不同的。 Supremenewyork.com 不允许 botapi.supremenewyork.com:8000... 不确定您是否关注。现在,如果您是客户端应用程序,则向botapi.supremenewyork.com:8000 发出请求,这是相同的主机名和端口。或者,正如我所提到的,创建一个代理以向您想要的任何地方发出请求并从您的客户端接收请求......
    • 啊,好吧,现在我明白了。有没有链接到我可以如何做上面的第三个选项?
    • 您可以在我的一个存储库 (github.com/heldrida/starling-round-up/blob/master/api/index.ts) 中找到一个工作示例;但想法是编写调用服务器端,它会根据您的请求计算并重定向它。
    • 如果我已经有代理怎么办?我不能用这些来掩盖请求的来源吗?我只是在axios中使用proxy属性试了一下,还是不行。我会看看你的回购
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2012-04-28
    相关资源
    最近更新 更多