Ajax Call to Node / Express - есть ли лучший способ? - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть вызов ajax из внешнего интерфейса одного домена / сервера (будет называться этот PublicDomain), отправка сообщения в приложение Node / Express JS на другом сервере (вызовет этот NodeDomain). Все это прекрасно работало до установки SSL на PublicDomain. Поэтому я назначил полное доменное имя NodeDomain и на него также наложил SSL, чтобы избежать ошибок со смешанным содержимым. NodeDomain прослушивает порт 3000, который, очевидно, не покрывается SSL (только порт 443). Я попытался перенаправить запрос со страницы интерфейса NodeDomain (порт 443) на порт 3000. Получите ошибку нарушения CORS. Я пытался использовать пакет узлов CORS, но все равно получаю ошибку. Я попытался установить заголовки на обоих сайтах («Access-Control-Allow-Origin», «*»). Все еще получите ошибку. Даже если мне удастся заставить CORS принять совместное использование источников, я боюсь, что у меня все еще могут возникнуть проблемы со смешанным содержимым, если браузер увидит перенаправление 301 (которое, я вижу, распознает это в консоли разработчика). Итак ... может быть, есть лучший способ передать данные из общедоступного интерфейса одного сервера в приложение узла другого сервера (и получить ответ обратно)? Если нет лучшего способа и, возможно, есть проблема с моим кодом, я вставлю ниже файл server.js. И только Ajax функционирует с общедоступного сервера ниже этого. Я сделал это немного проще, удалив большую функцию (сеттер).

const express = require('express');
const cors = require('cors');
const ethers = require('ethers');
const dotenv = require('dotenv');
const https = require('https');
dotenv.config();

const port = 3000;

// the code below did not help:
// app.use(function (req, res, next) {
//  res.header("Access-Control-Allow-Origin", "*");
//  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
//  next();
// });

// also tried putting the following in the response, but did not fix the issue:
// res.send(req.setRequestHeader('Access-Control-Allow-Headers',' *'));

const app = express();

// this also does not help:
app.use(cors());

app.use(express.urlencoded({
    extended: true
}));

app.use(express.json());

listenToPort();

app.post('/save', cors(), function(req, res) {
    // the following line does not help:
    res.header("Access-Control-Allow-Origin", "*");

    console.log("remote connected to port " + port);

    if (req.body.action && req.body.action == "getLoad") {
        if (req.body.loadIndex) {
            var loadIndex = req.body.loadIndex;
        } else {
            var loadIndex = 999;
        }
        let now = Date().toString();

        const infura = `https://ropsten.infura.io/v3/${process.env.INFURA_API_KEY}`;
        var abi = process.env.ABI;

        const contractAddress = process.env.CONTRACT_ADDRESS; //Contract Address

        let provider = new ethers.providers.InfuraProvider('ropsten', process.env.INFURA_API_KEY);

        let contract = new ethers.Contract(contractAddress, JSON.parse(abi), provider);

        contract.loads(loadIndex).then((loadInfo) => {
            res.send(loadInfo);
        });
    }
});

function listenToPort() {
    // before SSL certificate:
    // app.listen(port, () => console.log('App listening on port :' + port));

    // I tried using openSSL.  Pointless to try to connect directly to port 3000 since it's self-signed returns a certificate error, but seemed to temporarily get rid of the mixed content error when connecting to 443 & redirecting from port 443 to port 3000:
    https.createServer({
            key: fs.readFileSync('./key.pem'),
            cert: fs.readFileSync('./cert.pem'),
            passphrase: '*********'
        }, app)
        .listen(port, function() {
            console.log('App listening on port :' + port);
        });
}

А функция Ajax из PublicServer на всякий случай помогает:

        jQ.ajax({
            method: "POST",
            url: "https://nodeserver.io/save",
            data: {loadIndex, action: "getLoad"},
            success: function (response) {
                spinner(0, "done");
                jQ("#bcRow"+row).html('<div class="col loadID">'+parseInt(response[0]._hex)+'</div><div class="col time">'+response[3]+'</div><div class="col lat">'+response[1]+'</div><div class="col lon">'+response[2]+'</div><div class="col verify"></div>');

            },
            error: function (error) {
                spinner(0, "done");
                jQ("#summary").prepend('<span class="errorSummary">There was an error: ' + JSON.stringify(error) + '</span><br>');
            }
        })
...