как развернуть ExpressJS в TypeScript в Azure?

#node.js #typescript #azure #express #web-deployment

Вопрос:

Я пытаюсь создать экспресс-сервер для службы API, используя этот экспресс-генератор:
генератор-экспресс-без стресса-машинописный текст

Я могу запустить экспресс-сервер локально с помощью npm run dev .
Я могу запустить npm run compile , чтобы создать производственную сборку в папке dist.
Пакет продукта папки dist можно запустить npm run start без проблем.

Однако мне не удалось развернуть приложение на своем сервере Azure. Я следовал этому документу Microsoft, чтобы развернуть Express.js в службу приложений Azure с помощью кода Visual Studio. После всех шагов, когда я просматриваю приложение, оно показывает You do not have permission to view this directory or page.

На какую-нибудь статью или документ я могу сослаться? Спасибо за любую помощь.

раздел package.json scripts по умолчанию создан генератором-экспресс-без стресса-машинописный текст

   "scripts": {
    "start": "node dist/index.js",
    "compile": "ts-node build.ts amp;amp; tsc",
    "dev": "nodemon server/index.ts | pino-pretty",
    "dev:debug": "nodemon --exec "node -r ts-node/register --inspect-brk" server/index.ts | pino-pretty",
    "lint": "eslint -c .eslintrc.js "{server, test}/**/*.{js,ts,tsx}" --quiet",
    "lint:fix": "eslint -c .eslintrc.js "{server, test}/**/*.{js,ts,tsx}" --quiet --fix",
    "test": "mocha -r ts-node/register test/**/*.ts --exit",
    "test:debug": "mocha -r ts-node/register --inspect-brk test/**/*.ts --exit"
  },
 

Комментарии:

1. Linux или Windows ?

2. мой компьютер-Windows, в Azure я тоже выбрал Windows.

3. Пожалуйста, запустите «tsc-v», затем скажите мне, какую версию машинописи вы используете, потому что я не могу успешно запустить, запустив » запуск npm’ на локальном компьютере. Я просто могу запустить » npm run start:dev’.

4. моя версия машинописного текста-4.3.2

5. После серии тестов я потерпел неудачу. Я начну щедрость, если кто-нибудь с другим соответствующим опытом сможет дать ответы.

Ответ №1:

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

Azure требуется iisnode/web.config для выполнения приложения

когда я снова просматриваю этот учебный документ Microsoft, я обнаружил, что в их образце проекта в корневой папке находится файл web.config

перейдите по этой ссылке: https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config

в нем говорится: «Этот файл конфигурации необходим, если iisnode используется для запуска процессов узла позади».

Я скопировал тот же файл в свой проект, который мой проект генерируется этим генератором: генератор-экспресс-без стресса-машинопись
Что я сделал со своим проектом:

  1. используйте генератор для создания примера сервера экспресс-API
  2. запустите npm run compile , чтобы скомпилировать сборку продукта в dist папку
  3. скопируйте вышеуказанный файл web.config в корневую папку
  4. измените содержимое, чтобы указать путь index.js , измените на dist/index.js
     <handlers>
      <!-- Indicates that the server.js file is a node.js site to be handled by the iisnode module -->
      <add name="iisnode" path="dist/index.js" verb="*" modules="iisnode"/>
    </handlers>
    ......
        <rule name="DynamicContent">
          ......
          <action type="Rewrite" url="dist/index.js"/>
        </rule>
 

в конце концов, я снова развертываю приложение в Azure, теперь сообщение об ошибке файла журнала изменилось. Теперь он показывает что — то вроде «Недопустимый номер порта, должен находиться в диапазоне 0-65xxx».

исправление логики перечисления портов

похоже, что среда с номером порта Azure-это не номер, а строка канала: https://www.geekwithopinions.com/2013/12/09/node-js-and-azure-is-it-a-port-or-a-pipe/

однако сгенерированная логика index.ts, поскольку она является машинописной, логика синтаксического анализа для порта, и это вызвало ошибку.

 // server/index.ts
......
const port = parseInt(process.env.PORT ?? '3000');
export default new Server().router(routes).listen(port);
 

Для быстрого тестирования я просто хочу доказать, как экспресс-сервер может работать в Azure, поэтому я не хочу исправлять логику машинописи. Вместо этого я напрямую изменил скомпилированный файл js, который был сгенерирован npm run compile , tsc сгенерированный файл dist/index.js , который должен быть выполнен Azure:

 // const port = parseInt((_a = process.env.PORT) !== null amp;amp; _a !== void 0 ? _a : '3000');
const port = (_a = process.env.PORT) !== null amp;amp; _a !== void 0 ? _a : '3000';
exports.default = new server_1.default().router(routes_1.default).listen(port);
 

разверните снова, и теперь это работает 🙂