#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 используется для запуска процессов узла позади».
Я скопировал тот же файл в свой проект, который мой проект генерируется этим генератором: генератор-экспресс-без стресса-машинопись
Что я сделал со своим проектом:
- используйте генератор для создания примера сервера экспресс-API
- запустите
npm run compile
, чтобы скомпилировать сборку продукта вdist
папку - скопируйте вышеуказанный файл web.config в корневую папку
- измените содержимое, чтобы указать путь
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);
разверните снова, и теперь это работает 🙂