express.Router 无法在 IIS 托管节点应用程序中工作

问题描述 投票:0回答:1

在本地运行我的 Node/Express 应用程序(例如 npm start)时,我的路由加载没有问题。然而,当应用程序托管在 IIS 中时(已尝试 iisnode、反向代理和 httpplaformhandler),它会在路由上给出 404...特别是 CANNOT GET。

这些路由位于“routes”目录中。

这是我的解决方案结构:

node_modules
public
    client.html
routes
    api1.js
    api2.js
server.js
web.config

这是我的 server.js,其中加载了路由:

// MODULES AND REQUIRES
const express = require("express");
const app = express();
const path = require('path');
const swaggerJsDoc = require("swagger-jsdoc");
const swaggerUi = require("swagger-ui-express");
const objectMapper = require('object-mapper');
const cors = require('cors');

// Require Routes
var api1 = require('./routes/api1.js')
var api2 = require('./routes/api2.js')

// PORTS AND BASIC EXPRESS APP SETTINGS
const port = process.env.PORT || 3000;

// CORS ALLOW ALL. NOTE IP RESTRICTIONS ARE IN PLACE
app.use(cors({
  origin: '*'
}));

// ignore request for FavIcon. so there is no error in browser
const ignoreFavicon = (req, res, next) => {
  if (req.originalUrl.includes('favicon.ico')) {
      res.status(204).end();
  }
  next();
};

// Configure nonFeature
app.use(ignoreFavicon);

// Root Route - Serve Static File
app.get('/', (req, res) => {
      res.sendFile(path.join(__dirname, '/public/client.html'));
});

// SWAGGER UI CONFIGURATION

// Primary Swagger Options
const options = {
  customCss: '.swagger-ui .topbar { display: none } .swagger-ui .scheme-container { display: none }'
};

// Custom Swagger Options: https://swagger.io/specification/#infoObject
const swaggerOptions = {
  swaggerDefinition: {
    info: {
      version: "2.0.0",
      title: "My App",
      description: "This page lists the available APIs within my app and allows you to test them.",
      contact: {
        name: "My Name"
      },
      servers: [{"url":"http://localhost:3000", "description": "Development server"}]
    }
  },
  // ['.routes/*.js'] Location for APIs
  apis: ["./routes/*.js"],
};

const swaggerDocs = swaggerJsDoc(swaggerOptions);
app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerDocs, options));


// ROUTES
  app.use('/api1', api1)
  app.use('/api2', api2)  

// APP LISTEN WITH SSL/HTTPS
app.listen(port, () => {
  console.log(`Server listening on port ${port}`);
});

这是我的 Web.config(当前使用 httpplatformhandler):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="httppPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
    </handlers>
    <httpPlatform stdoutLogEnabled="true" stdoutLogFile=".\logs\node.log" startupTimeLimit="20" processPath="C:\Program Files\nodejs\node.exe" arguments=".\server.js">
            <environmentVariables>
                <environmentVariable name="PORT" value="%HTTP_PLATFORM_PORT%" />
                <environmentVariable name="NODE_ENV" value="Production" />
            </environmentVariables>
        </httpPlatform>
  </system.webServer>
</configuration>
  1. 当您拉出 / 时,/ 会毫无问题地加载 client.html 页面 根域
  2. /api-docs 加载 Swagger 没有问题
  3. /api1 失败,无法获取/404
  4. /api2 失败,无法获取/404

由于这是 IIS,我尝试了更完整的路由“路径”。前任。 routes/api1 但这不起作用。

Express.Router 不能与 IIS 中托管的节点/express 应用程序一起使用吗?

当我将其设置为反向代理时,localhost:3000 运行 /api1 没有问题,但 mynode.com 的 IIS 中的域抛出 Cannot Get /api1... 即使它应该只是一个代理。

失败的请求跟踪显示以下内容:

MODULE_SET_RESPONSE_ERROR_STATUS

模块名称httpPlatformHandler

通知EXECUTE_REQUEST_HANDLER

HTTP 状态 404

未找到HttpReason

HttpSubStatus 0

ErrorCode 操作成功完成。 (0x0)

javascript node.js express iis httpplatformhandler
1个回答
0
投票

我已经能够通过运行反向代理并将节点设置为在端口 3000 上运行来解决此问题。对于 SSL 地址,我还需要在节点应用程序中添加证书。

© www.soinside.com 2019 - 2024. All rights reserved.