【问题标题】:Express app.listen returns Promise { Server {} }Express app.listen 返回 Promise { Server {} }
【发布时间】:2020-07-21 15:27:06
【问题描述】:

我有一个快速服务器正在运行,我在编写单元测试时遇到了问题。我有一个连接到数据库的启动函数,然后返回一个带有 app.listen() 的服务器。问题是,如果我从异步函数中返回 app.listen,我会得到一个带有服务器的 Promise,我试图解决这个 Promise,等待这个 Promise,从 .then() 返回一个服务器。我不想要我想要服务器的承诺。

express.ts

import express from 'express';

const app = express();

export { app };

startup.ts

import { app } from './express';
import { sequelize } from './sequelize';

app._startup = (async() => {
  switch (process.env.NODE_ENV) {
    case "production":
      await sequelize.authenticate();
      break;
    case "test":
      await sequelize.sync({ force: true });
      break;
    case "development":
    default:
      await sequelize.sync({ force: false });
      break;
  }
})().then(() => true);

export { app };

server.ts

import { app } from './startup';

// export const server = app.listen(8080); // This works

export const server = (
  async() => {
    await app._startup;
    return app.listen(8080); // This does not work
  }
)();

因为 Server {} 在 Promise {} 中,所以我的单元测试都失败了

console.log(server);
// => Promise { Server { } }

如何在导出服务器之前解决这个承诺?

【问题讨论】:

  • 在处理导出之前,您不能“等待”异步任务完成。模块中的导出只能同步工作(目前 - 正在解决这个问题)。您可以使用const server = http.createServer(app) 同步创建服务器并将其导出,然后仅在您的启动工作完成后使用server.listen(8080) 启动服务器。

标签: javascript node.js express promise


【解决方案1】:

您可以等待函数完成async 任务。由于您将server 定义为async 函数,您可以使用await 关键字等待它完成。实现如下:

import { app } from './startup';

export const server = app.listen(8080);
export const server = await (  // use await to wait
  async() => {
    await app._startup;
    return app.listen(8080); // This does not work
  }
)();

【讨论】:

  • 您重新声明了一个 const 变量,您在异步函数之外等待,异步函数与原始帖子具有相同的功能
【解决方案2】:

感谢您的评论@jfriend00

解决办法贴在下面

const server = createServer(app);

(async() => {
  await app._startup;
})().then(() => server.listen(8080));

export { server };

【讨论】:

    猜你喜欢
    • 2018-03-11
    • 2018-11-17
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 2020-10-12
    • 2018-08-19
    相关资源
    最近更新 更多