IIS web.config переписать правило с данными POST в приложение Node.js - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть приложение Node.js, работающее в экземпляре службы приложений Azure. Я следовал этому руководству , чтобы создать файл IIS web.config, который собирает все не файловые запросы и переписывает в entry/server.js, где находится точка входа моего приложения.

Для GET запросов это прекрасно работает во всех случаях.

Для POST запросов это другая история. Хотя они работают в других средах без изъянов, запросы POST работают только на IIS, когда тело пустое. По крайней мере, они делают это в приложении Node.js в этом сценарии. Но когда я пытаюсь отправить запрос POST с телом, состоящим из необработанного JSON (как вы обычно делаете с приложениями Node.js), запрос никогда не попадает в приложение Node.js. Примерно через тридцать секунд он истекает, и я получаю «502 - веб-сервер получил неверный ответ, выступая в качестве шлюза или прокси-сервера».

Итак, что-то не так с моим файлом web.config и используемым правилом перезаписи?

TLDR: IIS не отправит запрос POST в мое приложение Node.JS, если оно имеет тело с необработанным JSON.

РЕДАКТИРОВАТЬ: Я действительно использую модуль bodyParser, и опубликовал доказательства этого ниже. Он работает в средах, которые не являются Azure / IIS

Мой файл web.config:

<configuration>
      <system.webServer>
        <webSocket enabled="false" />
        <handlers>
          <!-- Indicates that the server.js file is a node.js site to be handled by the iisnode module -->
          <add name="iisnode" path="entry/server.js" verb="*" modules="iisnode"/>
        </handlers>
        <rewrite>
          <rules>
            <!-- Do not interfere with requests for node-inspector debugging -->
            <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
              <match url="^entry/server.js\/debug[\/]?" />
            </rule>
            <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
            <rule name="StaticContent">
              <action type="Rewrite" url="public{REQUEST_URI}"/>
            </rule>

            <!-- All other URLs are mapped to the node.js site entry point -->
            <rule name="DynamicContent">
              <conditions>
                 <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
              </conditions>
              <action type="Rewrite" url="entry/server.js"/>
            </rule>
          </rules>
        </rewrite>

        <!-- 'bin' directory has no special meaning in node.js and apps can be placed in it -->
        <security>
          <requestFiltering>
            <hiddenSegments>
              <remove segment="bin"/>
            </hiddenSegments>
          </requestFiltering>
        </security>

        <!-- Make sure error responses are left untouched -->
        <httpErrors existingResponse="PassThrough" />
      </system.webServer>
     </configuration>

Основные настройки промежуточного программного обеспечения для приложения Node.js:

app.use(bodyParser.json());
app.use(cookieParser())
app.use(bodyParser.urlencoded({ extended: false }))
app.use(cors({
  origin: process.env.WEB_URL,
  credentials: true
}))

1 Ответ

0 голосов
/ 11 апреля 2019

Если вы используете express.js, вам конкретно нужно добавить urlencoded и json для вашего бэкенда.

const app = express()
app.use(
    express.urlencoded({extended:false}),
    express.json(),
)

В противном случае запрос POST и данные JSON не могут быть обработаны.

Если выиспользуйте что-то еще, что вы должны проверить в руководстве о том, как активировать данные POST и JSON.

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