如何将 TypeScript 中的 ExpressJS 部署到 Azure?

how to deploy ExpressJS in TypeScript to Azure?

我正在尝试为 API 服务创建一个 Express 服务器,使用这个 express 生成器:
generator-express-no-stress-typescript

我可以使用 npm run dev 在本地 运行 Express Server。
我可以 运行 npm run compile 在 dist 文件夹中创建生产版本。
使用 npm run start 可以毫无问题地启动 dist 文件夹产品包。

但是,我未能将应用程序部署到我的 Azure 服务器。我已按照 this Microsoft document,使用 Visual Studio 代码将 Express.js 部署到 Azure 应用服务。完成所有步骤后,当我浏览应用程序时它显示 You do not have permission to view this directory or page.

有什么文章或文档可以参考吗?感谢您的帮助。

package.json scripts 部分默认由 generator-express-no-stress-typescript

创建
  "scripts": {
    "start": "node dist/index.js",
    "compile": "ts-node build.ts && 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"
  },

我终于弄清楚我的包和部署出了什么问题。在这里我将分享我的发现。

Azure 需要 iisnode/web.config 来执行应用程序

当我再次查看this Microsoft tutorial document时,我发现在他们的示例项目中,根文件夹中有一个web.config文件

参考这个link:https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config

它说“如果 iisnode 用于 运行 后面的节点进程,则需要此配置文件”

我将相同的文件复制到我的项目中,我的项目是由这个生成器生成的:generator-express-no-stress-typescript
我对我的项目做了什么:

  1. 使用生成器生成示例 Express API Server
  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逻辑,因为它是TypeScript,端口的逻辑parseInt,它导致了错误。

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

为了快速测试,我只是想证明 Express Server 如何在 Azure 上运行,所以我不想修复 TypeScript 逻辑。而是直接修改npm run compile生成的编译js文件,tsc生成的文件dist/index.js,Azure执行:

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

再次部署,现在可以使用了:)