javascript - 异步函数调用不工作,同步工作
问题描述
我有一个具有以下路由的路由器:
router.post('/login', async (req, res, next) => {
try {
console.log(req.body);
const { username, password } = req.body;
const identity = await userService.getUserInfo(username, password);
if (!identity.authenticated) {
return res.json({});
}
const requiredTenantId = process.env.TENANT_ID;
const tenant = identity.tenants.find((it) => it.id === requiredTenantId);
if (requiredTenantId && !tenant) {
return res.json({});
}
const userResponse = {
...identity,
token: jwt.sign(
identity,
envVars.getVar(envVars.variables.AUTH_TOKEN_SECRET),
{ expiresIn: '2h' }
)
};
return res.json(userResponse);
} catch (err) {
return next(err);
}
});
这基本上是一个异步函数。
这是工作测试样本:
const request = require('supertest');
const user = require('../../routes/user');
describe('Test user login path', () => {
test('If authorized, it should response with authorized JWT token', () => {
request(user).
post('api/user/login/').
send({
username: 'admin',
password: 'admin'
}).
expect(200);
});
});
如果我在函数调用之前添加异步并在用户之前等待request
:
test('If authorized, it should response with authorized JWT token', async () => {
await request(user).
测试将失败并出现以下错误:
connect ECONNREFUSED 127.0.0.1:80
有人可以解释为什么会这样吗?因为在路由器中我使用的是异步路由功能。
解决方案
那是因为supertest
期望得到一个快速应用程序,而不是路由器
您可以创建一个用于测试的应用程序,挂载用户路由:
const app = express();
app.use(bodyParser.json());
app.use("/api/user", user);
app.listen(3000);
并将其传递给请求
await request(app)
.post("/api/user/login")
推荐阅读
- xdebug - 我可以在调试过程中找出哪个字段是公共的,哪个是私有的,哪个是受保护的?
- python - 如何在 Matplotlib 中折叠饼图上方和轴标题下方的空间?
- windows - 如何将条带附加到 CReBar 控件的右侧
- ruby-on-rails - 如何在上传到 S3 之前临时存储(缓存)图像?
- ios - ipa 未安装在 iphone 上,因为它不适用于此版本的 ios
- android - 在gridview中具有相同大小和分辨率的图像无法运行
- android-layout - 背景布局不适用于导航抽屉
- spring - 为 CrudRepository (findById) 的一种方法返回两种不同的数据类型
- python - deque 的大小如何影响 Tensorflow 模型的训练速度?
- reactjs - React Context API 很慢