此路线重定向正是我想要的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或者条纹指向我的网站这一事实,但这些对我来说都不是很有意义。在这一点上,我可能只是抓住吸管。
答案 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);
}