ядро dotnet — Несколько СПА — салонов-перенаправление из одного СПА-салона в другой СПА-салон, NextJS и реагирование

#javascript #reactjs #.net-core #next.js #middleware

Вопрос:

У меня есть два приложения, одно приложение React и одно приложение NextJS. Приложение React запущено на локальном хосте:5001, а приложение NextJS запущено на локальном хосте:3000. Когда я запускаю приложение, оно отлично запускается и запускает мой браузер на localhost:5001, загружая мое приложение react.

У меня есть некоторое промежуточное ПО, настроенное таким образом, чтобы, если путь запроса содержит слово «тест» (т. Е. localhost:5001/test, промежуточное программное обеспечение перенаправит меня на мой сервер nextjs, работающий на порту 3000, и будет обслуживать мою тестовую страницу на сервере nextjs, но по какой-то причине я не могу заставить его работать.

Я пытался перехватить информацию о запросе и изменить путь, порт и строку запроса, чтобы заставить nextjs забрать ее, но безрезультатно.

Если я введу localhost:3000/test в браузере во время работы приложений, я смогу нормально видеть свою страницу nextjs, поэтому я предполагаю, что это что-то в промежуточном ПО, из-за чего она не перенаправляется.

Что я здесь делаю не так?

 using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.HttpsPolicy; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Rewrite; using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.SpaServices.ReactDevelopmentServer; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; using System.Linq; using System.IO; using System.Threading; using System.Threading.Tasks; using Newtonsoft.Json; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.FileProviders;  namespace Client {  public class Startup  {  private IWebHostEnvironment mEnvironment;  public Startup(IConfiguration configuration, IWebHostEnvironment environment)  {  Configuration = configuration;  mEnvironment = environment;  }   public IConfiguration Configuration { get; }   public void ConfigureServices(IServiceCollection services)  {  services.AddControllersWithViews();   // In production, the React files will be served from this directory  services.AddSpaStaticFiles(configuration =gt;  {  configuration.RootPath = "ClientApp/build";  });  services.AddSingletonlt;IHttpContextAccessor, HttpContextAccessorgt;();  }   public void Configure(IApplicationBuilder app, IWebHostEnvironment env)  {  if (env.IsDevelopment())  {  app.UseDeveloperExceptionPage();  }  else  {  app.UseExceptionHandler("/Error");  app.UseHsts();  }   app.UseHttpsRedirection();  app.UseStaticFiles();  app.UseSpaStaticFiles();   app.MapWhen(c =gt; c.Request.Path.Value.Contains("test"), appBuilder =gt;   {   appBuilder.Run(async (context) =gt;   {  context.Connection.LocalPort = 3000;  context.Connection.RemotePort = 3000;  context.Request.Path = "/_next/webpack-hmr?page=/test";  context.Request.PathBase = "/_next/webpack-hmr";  context.Request.QueryString = new QueryString("?page=/test");  context.Request.Host = new HostString("localhost:3000");    app.UseSpa(spa =gt;   {  spa.Options.SourcePath = "next";  });  });  });    app.UseRouting();   app.UseEndpoints(endpoints =gt;  {  endpoints.MapDynamicControllerRoutelt;SubdomainRouteTransformergt;(  pattern: "{controller}/{action=Index}/{id?}");  });   app.UseSpa(spa =gt;  {  spa.Options.SourcePath = "ClientApp";   if (env.IsDevelopment())  {  spa.UseReactDevelopmentServer(npmScript: "start");  }  });   app.UseSpa(spa =gt;   {  spa.Options.SourcePath = "next";   if(env.IsDevelopment())  {  spa.Options.StartupTimeout = TimeSpan.FromSeconds(120);  spa.UseProxyToSpaDevelopmentServer("https://localhost:3000");  spa.UseReactDevelopmentServer(npmScript: "dev");  }  });  }  }  }  

Вот моя следующая работа server.js файл:

 const { createServer } = require('https') const { parse } = require('url') const next = require('next') const fs = require('fs');  const dev = process.env.NODE_ENV !== 'production' const app = next({ dev }) const handle = app.getRequestHandler()  //VERY UNSAFE -- figure this out later process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";  var privateKey = fs.readFileSync('localhost.key', 'utf8'); var certificate = fs.readFileSync('localhost.crt', 'utf8');  const httpOptions = {  key: privateKey,  cert: certificate };  app.prepare().then(() =gt; {  createServer(httpOptions, (req, res) =gt; {   //console.log(req);  // Be sure to pass `true` as the second argument to `url.parse`.  // This tells it to parse the query portion of the URL.   const parsedUrl = parse(req.url, true)  const { pathname, query } = parsedUrl   console.log(parsedUrl);   if (pathname === '/a') {  app.render(req, res, '/a', query)  } else if (pathname === '/b') {  app.render(req, res, '/b', query)  } else {  handle(req, res, parsedUrl)  }  }).listen(3000, (err) =gt; {  if (err) throw err  console.log('gt; Ready on https://localhost:3000')  }) })  

И моя файловая структура выглядит так:

 Client  ClientApp  Controllers  next  pages  test.js Startup.cs Program.cs