Как правильно развернуть React + Node + Express + MySQL в Microsoft Azure? - PullRequest
0 голосов
/ 13 мая 2019

Я бы хотел развернуть реагирующее приложение как статический веб-сайт в Microsoft Azure (созданный FTP и WebApp) и связать с ним приложение nodejs (серверные команды с экспресс-вызовом), которое отправляет команды в базу данных sql.

Я пытался создать два разных приложения в Azure (приложение веб-сайта и nodejs) и связать его, но это не сработало Я пытался изменить правила с помощью файла web.config, и это не сработало Я прочитал много документации (stackoverflow, документы Microsoft Azure, блоги, Tomshardware, GitHub, веб-сайт разработчиков, ...) Кроме того, я сделал много попыток с небольшими изменениями (создание специального пути с помощью инструмента Azure, такого как / azkdazdok, чтобы связать index.js приложения nodejs и другие мелочи)

Мое приложение реагирования имеет только одну функцию для отправки запросов:

export const request=function(info){
    return fetch("https://myaddress/index.js:443/dot",{
    //return fetch("http://localhost:8081/dot",{
        method:info.method,
        credentials:'same-origin',
        body:JSON.stringify(info),
        mode:'cors',
        headers:{'Content-Type':'application/json'}
    });
}

И на index.js узла приложения у меня есть:

const version="1.0.0"

var app=require('express')();
var http=require('http').Server(app);
var mysql=require('mysql');
var bodyParser=require('body-parser');
var jwt = require('jsonwebtoken');
var cookieParser = require('cookie-parser');
var fs=require("fs");

//~ app.use(express.static('../wwwroot'));

app.use(bodyParser.json({limit:'50mb'}));
app.use(bodyParser.urlencoded({limit:'50mb',extended:true}));
app.use(cookieParser());

const CREATE_TABLE_USER = fs.readFileSync("src/sql_script/create_table_user.sql").toString();
const CREATE_TABLE_USER_PREFERENCES = fs.readFileSync("src/sql_script/create_table_user_preferences.sql").toString();
const CREATE_TABLE ...
...;

var con=mysql.createConnection({
    host:[myhost],
    user:[user],
    password:[pw]",
    database:[db_name],
    port:3306,
    ssl:{ca:fs.readFileSync({ca-cert filename})}
});

con.connect(function(err){if(err){console.log(err);}console.log("Connected to database\n");});
con.query(CREATE_TABLE_USER,function(err,result){if(err){console.log(err);}})
con.query(CREATE_TABLE_USER_PREFERENCES,function(err,result){if(err){console.log(err);}})
con.query(...
...;

[functions]

app.post('/dot',function(req,res){
    if(req.body.action === "something"){something(req,res);}
});

http.listen(443,function(){console.log('app listening on port 443!');})

Он прослушивает порт 443 с точкой входа / точка. Он подключается к базе данных mysql каждый раз, когда это необходимо, и выполняет всю работу.

И у меня есть файл web.config

<?xml version="1.0"?>
<configuration>
    <system.webServer>
        <handlers>
            <add name="iisnode" path="server/index.js" verb="*" modules="iisnode"/>
        </handlers>
        <rewrite>
            <rules>
                <rule name="DynamicContentDot">
                    <match url="^dot"/>
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
                    </conditions>
                    <action type="Rewrite" url="src/index.js"/>
                </rule>
                <rule name="DynamicContentTest">
                    <match url="^test"/>
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
                    </conditions>
                    <action type="Rewrite" url="src/index.js"/>
                </rule>
                <rule name="React Routes" stopProcessing="true">
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
                        <add input="{REQUEST_URI}" pattern="^/(api)" negate="true"/>
                    </conditions>
                    <action type="Rewrite" url="index.html"/>
                </rule>
            </rules>
        </rewrite>
        <httpErrors existingResponse="PassThrough"/>
    </system.webServer>
</configuration>

Но проблема в следующем: -Я создал WebApp + MySQL на Miscrosoft Azure -Отправили сборку React от FileZila с -Отправили необходимые файлы index.js и другие nodejs - Запустите консоль редактора службы приложений для установки npm - сохраните библиотеки index.js -Изменили маршрутизацию запросов для ссылки на nodejs index.js

И все же у меня есть те же проблемы: ошибка 405: метод не разрешен в POST -status 200 с GET, но отвечает «Вам нужно включить JavaScript для запуска этого приложения».

Должен ли я попробовать другой способ еще раз с двумя приложениями? Одно приложение связано с виртуальной машиной? Что-то еще?

Мой ожидаемый результат - просто отправить запрос по адресу: 443 / dot, nodejs с index.js заставляет его работать в app.post. Он отлично работает на местном уровне, но есть некоторые вещи, которые я не могу сделать на местном уровне, такие как реальные тесты или просто завершение контракта с заказчиком. Это первый раз, когда я делал проект React + Node + Express, и одного парня, который должен был это делать (специалиста), там больше нет, и моя основная часть - это алгоритмические, находящие математические и логические решения на языках, которые я знаю. Я уже решил много проблем, изучил один React и немного Node, но теперь я действительно заблокирован.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...