Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.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
Node.js 如何调用express触发外部重定向并避免CORs_Node.js_Ajax_Express_Cors_Shopify - Fatal编程技术网

Node.js 如何调用express触发外部重定向并避免CORs

Node.js 如何调用express触发外部重定向并避免CORs,node.js,ajax,express,cors,shopify,Node.js,Ajax,Express,Cors,Shopify,我试图通过ajax调用从前端触发一个express.js路由。一旦路由被调用,它将重定向到外部重定向到另一个域。每次我运行这条路线时,我都会遇到CORs飞行前错误 我认为理想的工作流应该是这样的: 用户单击订阅按钮 一个AJAX(Jquery)调用被发送到express路线(app.get('/shopify/new charge') 这条快线通车 外部重定向被触发,用户被发送到另一个域 通过我的研究,我认为问题在于从后端到前端的反应 我已尝试实施以下措施: 修改AJAX调用 server.j

我试图通过ajax调用从前端触发一个express.js路由。一旦路由被调用,它将重定向到外部重定向到另一个域。每次我运行这条路线时,我都会遇到CORs飞行前错误

我认为理想的工作流应该是这样的:

  • 用户单击订阅按钮
  • 一个AJAX(Jquery)调用被发送到express路线(app.get('/shopify/new charge')
  • 这条快线通车
  • 外部重定向被触发,用户被发送到另一个域
  • 通过我的研究,我认为问题在于从后端到前端的反应

    我已尝试实施以下措施:

    • 修改AJAX调用
    • server.js中的npm CORS
    • 向server.js添加标题
    • 向ajax添加头文件
    • 向重定向添加标题
    • 向重定向添加状态(res.redirect(301),)
    • 在res.redirect()之后添加next()
    • 将原点和带有路线的原点列为白名单
    然而,我成功地解决了这个冲突,用一个表单包装了我的按钮,并消除了AJAX调用,但是我想知道这是否可以通过前端的AJAX调用实现

    前端Ajax调用

        activateSubscriptionButton.addEventListener('click', function () {
    ​
            var newChargeUrl = "/shopify/new-charge;
    ​
            $.ajax({
                type: "GET",
                url: newChargeUrl,
                data: {"shop" : test.com},
                success: function (result) {
                    console.log('Success - Paid');
                },
                error: function (jqXHR, exception) {
                    console.log('Error - No Paid');
                    console.log('jqXHR :', jqXHR);
                },
            });
    ​
        }, false);
    
    
    Express.js路线

    app.get("/shopify/new-charge", function (req, res, next) {
                const shop_domain = req.query.shop;
    
                const shopRequestUrl = 'https://' + shop_domain + '/admin/api/2019-04/recurring_application_charges.json';
    
                const newCharge = {
                    "recurring_application_charge": {
                        "name": "Professional Plan",//
                        "price": 4.99,
                        "return_url": forwardingAddress + "\/shopify\/billing\/activate?shop=" + encodeURIComponent(shop_domain),
                        "test": true,
                    }
                };
                        request.post(shopRequestUrl,
                            {
                                headers: {
                                    'X-Shopify-Access-Token': access_token,
                                },
                                json: newCharge
                            }, function (error, response, body) {
                                if (error) {
                                    console.error('Error has occurred with charge: ', error);
                                    return
                                }
                                else {
                                    // Redirect User To External Confirmation Page//
                                    res.redirect('https://external-url.com/');
                                }
                            })   
                else {
                    res.send('Error: No shop_domain.');
                }
            });
    
    Server.js

            var express = require("express");
            var app = express();
            var bodyParser = require("body-parser");
            const forwardingAddress = process.env.ngrok_forwarding_address;
    
            app.use(express.static("public"));
            app.use(bodyParser.urlencoded({ extended: true }));
            app.use(bodyParser.json());
            app.use(bodyParser.text());
    
            require("./controllers/shopify")(app);
            require("./controllers/billing")(app);
    
            // Setting up port and requiring models for syncing
            var PORT = process.env.PORT || 3000;
    
            app.listen(PORT, function () {
                console.log("Server listening on: http://localhost:" + PORT);
            });
    
    以下是我运行上述代码时收到的错误:

    选项:404

    CORS策略已阻止从源“”访问位于“”的XMLHttpRequest(从“”重定向):对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“Access-control-Allow_origin”标头


    有没有办法通过修改上面介绍的现有代码来实现我的目标?

    您确实错过了Shopify的一个基本功能。对于您的应用程序,请在您的合作伙伴帐户中进入应用程序设置,并为该应用程序创建一个应用程序代理调用。您创建的端点就是您从前端使用你的JS代码.Shopify确保了安全性,所有CORS问题都消失了。这就是为什么应用程序代理存在的原因,它允许安全地对后端应用程序进行前端调用


    TL:DR;您的前端模式注定失败,您应该重新考虑使用安全应用程序代理。

    您的代码没有显示任何试图访问的代码
    https://external-url.com/
    这显然是导致问题的URL。因此,我们看不出是什么代码导致了问题。这是在哪里发生的?t您显示的Ajax调用似乎是页面域的本地调用,而不是
    https://external-url.com/
    @jfriend00我压缩了代码。现在,“”位于Express.js路由代码片段的底部。感谢您指出这一点。因此Ajax调用被重定向到另一个域???@epascarello我正在尝试使用Ajax调用端点,然后在端点的末尾,我希望它执行外部重定向。哈哈,谢谢David。你对Shopify的信息总是很有见解。因此,如果我将应用程序代理设置为“apps/new charge”,代理URL“”,那么我会在我的ajax调用中调用“apps/new charge”?研究应用程序代理。开始购买followi不会太多他们举了很多例子。