如何使用Node Express完全“异步”?

时间:2019-02-08 07:38:36

标签: node.js typescript express async-await

我的系统中有许多异步功能,因此我需要“一直向下同步”,这就是创建http.Serverexpress.Application应用程序的地步。

(这在异步系统中是不可避免的-构造函数中将需要许多异步例程,而这是无法完成的,因此我们需要使用异步工厂函数来代替,这将导致异步蠕变所有直到入口点。)

但是我不确定用于引导应用程序的Node / TypeScript语法。

我的主要入口是System.ts

class default export System {

  public constructor() {
    // init Express.Application
    // init http.Server
    // init other parts of the system
  }

  public async start(): Promise<void> {
    // start the system asynchronously
    // start listening with http.Server
  }

}

然后我有一个引导模块Main.ts

import System from "./System"
const system = new System();
export default ???;                      // PROBLEM IS HERE

应该运行哪个:

node ./dist/Main.js

但是我不确定在导出行中使用什么。我尝试了所有这些:

export default await system.start();     // doesn't compile (obviously)
export default system.start();           // doesn't seem right
export default system.start().then();    // this works *maybe*

最后一行基于烟雾测试进行工作-但我不确定这是否是这样做的方法,以及不确定是否有可能失败的事情。

启动异步节点应用程序的规范方法是什么?


更新
根据@JacobGillespie的回答,Main.ts引导模块现在为:

import System from "./System"
new System().start().then();
//new System().start().catch(e => console.error(e));  // alternative

在我的情况下,System.ts具有错误和未处理的Promise处理程序,并进行日志记录(否则使用“ alternative”行)。因此,引导模块仅引导系统。

2 个答案:

答案 0 :(得分:1)

async / await在此处是基于诺言的,因此您本质上是想通过调用.then.catch来“开始”诺言。

为此,我的代码片段是创建一个异步runmain函数,然后将错误处理附加到该过程中,如下所示:

async function run() {
  // run the app, you can await stuff in here
}

run().catch(err => {
  console.error(err.stack)
  process.exit(1)
})

在您的情况下,看起来像(Main.ts):

import System from "./System"

async function run() {
  const system = new System()
  await system.start()
}

run().catch(err => {
  console.error(err.stack)
  process.exit(1)
})

您不需要导出任何内容,因为此模块文件不会导入其他任何地方(它是入口文件)。

您可以只调用system.then()system.catch(),但我个人喜欢async function run()模式,因为将来可能需要协调多个异步事务,这会使代码更加复杂明确的。

答案 1 :(得分:0)

system.start().then() => {
    value => export default value
}

我认为,更好的方法是: System.ts:

function System():Promise<string>{
    //setup express and the server
    return new Promise((res,rej) => {
        //the server var is just the http server instance
        server.listen(8000,() => resolve("server created"));
    });
}
export {System}

然后在Main.ts中:

import {System} from "yourpath"

然后:

System().then(() => {
    //code runs when server is created
}).catch(err => console.error(err));