【发布时间】: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