Node Express 重定向在生产中的 Safari 中不起作用

Node Express redirect not working in Safari in Production

此路由重定向在 Chrome 和 Firefox 中完全符合我的要求,但由于某种原因,它在生产环境中的 Safari 中不起作用:

var express = require('express');
var router = express.Router();
var pool = require('../modules/pg-pool');

router.get('/', async (req, res) => {
    var client = await pool.connect();
    try {
        var stripeConnectState = req.query.state;
        var stripeConnectVendorIdResult = await client.query('SELECT vendor_id ' +
            'FROM users_vendors ' +
            'WHERE stripe_connect_state=;',
            [stripeConnectState])
        client.release();
        if (stripeConnectVendorIdResult.rows[0] && stripeConnectVendorIdResult.rows[0].vendor_id) {
            var stripeConnectVendorId = stripeConnectVendorIdResult.rows[0].vendor_id;
        }
        if (stripeConnectVendorId) {
            var redirectUrl = [req.protocol, '://', req.get('Host'), '/#/account/vendor/details/', stripeConnectVendorId, '?', req.originalUrl.split("?").pop()].join('');
            res.redirect(redirectUrl);
        } else {
            console.log('There was no vendor id to match the stripe state received');
            res.sendStatus(403);
        }
    } catch (e) {
        console.log('Error vendor id GET SQL query task', e);
        res.sendStatus(500);
    }
});

module.exports = router;

对我来说最疯狂的是,当我在 Safari 中进行本地测试时,它成功了!出于某种原因,当我部署到 Heroku 时,它不再适用于 Safari 的生产环境。

当我在本地测试时,它正在重定向到

http://localhost:5000/#/account/vendor/details/7?state=XXXXXXXXXXXXXXXXXXXXXXXX&scope=read_write&code=ac_XXXXXXXXXXXXXXXXXX

但在生产中,它正在重定向到基础 url

https://www.fairlywed.com/

没有 Stripe 发送的极其重要的查询参数。这几乎就像我手头上的竞争条件,在 Chrome 或 Firefox 中永远不会触发,但总是在 Safari 中触发。

我也想知道我对 angular-ui-router 的使用或 stripe 指向我的站点的事实是否可能涉及,但 none 这些确实对我来说很有意义。我现在可能只是在抓住救命稻草。

我找到了一个创可贴解决方案,但我仍然不确定为什么会这样。在生产中,req.protocolhttp 的形式出现,由我的代码的另一部分处理:

function redirectChecker (req, res, next) {
    if (env === 'production') {
        if (req.headers['x-forwarded-proto'] !== 'https') {
            var urlAfterConversion = ['https://', req.get('Host'), req.url].join('');
            return res.redirect(urlAfterConversion);
        }
    }
    return next();
};

出于某种原因,在 Safari 上重定向不起作用(也许 Safari 不接受重定向后跟重定向?)

因此失败并重定向到我的目标网页。我仍然不确定为什么它解决了问题,但这段代码有效:

if (stripeConnectVendorId) {
    var env = process.env.NODE_ENV || 'development';
    var redirectUrl = [req.protocol, '://', req.get('Host'), '/#/account/vendor/details/', stripeConnectVendorId, '?', req.originalUrl.split("?").pop()].join('');
    if (env === 'production') {
       redirectUrl = 'https:' + redirectUrl.split(':')[1];
    }
    res.redirect(redirectUrl);
} else {
    console.log('There was no vendor id to match the stripe state received');
    res.sendStatus(403);
}