Node Express重定向在生产中的Safari中无法正常工作

时间:2017-07-21 14:00:00

标签: express heroku safari angular-ui-router stripe-connect

此路线重定向正是我想要的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=$1;',
            [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

但在制作中,它会重定向到基本网址

https://www.fairlywed.com/

没有Stripe发送的非常重要的查询参数。这几乎看起来我手上的竞争条件从未在Chrome或Firefox中触发,但总是在Safari中触发。

我也想知道我是否使用了angular-ui-router或者条纹指向我的网站这一事实,但这些对我来说都不是很有意义。在这一点上,我可能只是抓住吸管。

1 个答案:

答案 0 :(得分:1)

我找到了一个创可贴,但我还是不确定为什么会这样。在制作时,req.protocol作为http进入,由我的代码的另一部分处理:

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);
}