superagent / supertest with async / await
superagent / supertest with async / await
目标是正确设置变量 auth
以供进一步使用,因此我想重构函数 loginUser:
function loginUser(user, request, auth) {
return function(done) {
request
.post('/users/login')
.send(credentials)
.expect(200)
.end(onResponse);
function onResponse(err, res) {
auth.token = res.body.token;
return done();
}
};
}
loginUser(user, request, auth)(function() {
request.get(testUrl)
.set('Authorization', `bearer ${auth.token}`)
.expect(200, done);
});
像这样使用异步/等待(没有回调):
auth = await loginUser(user, request);
request.get(testUrl)
.set('Authorization', `bearer ${auth.token}`)
.expect(200, done);
但我正在努力 returning / 设置 auth
是否正确(如果我将 auth
作为参数或 return 值传递并不重要)。
我试过的是这样的:
async function loginUser(user, request) {
let auth;
await request
.post('/users/login')
.send(credentials)
.expect(200)
.end(onResponse);
function onResponse(err, res) {
auth.token = res.body.token;
}
return auth;
}
但是 auth
从未正确设置。
问题在于,由于 Nodejs 中的事件循环,onResponse 方法的执行时间比函数的 return 晚。因此,您必须在收到数据时准确解决承诺
方法 loginUserInternal 可能是这样的:
function loginUserInternal(user, request) {
return new Promise((resolve,reject) => {
let auth = {};
request
.post('/users/login')
.send({
username: user.username,
password: user.password_decoded,
})
.expect(200)
.end(onResponse);
function onResponse(err, res) {
if(err) return reject(err)
auth.id = res.body.id;
auth.token = res.body.token;
auth.tokenExpires = res.body.tokenExpires;
resolve(auth)
}
})
}
并像使用 async await 一样调用它。
不要使用 'end' 语法,那是回调:
const response = await request.post(...)
.expect(200)
const {body: {token}} = response
return token
基本上它应该看起来像同步代码
目标是正确设置变量 auth
以供进一步使用,因此我想重构函数 loginUser:
function loginUser(user, request, auth) {
return function(done) {
request
.post('/users/login')
.send(credentials)
.expect(200)
.end(onResponse);
function onResponse(err, res) {
auth.token = res.body.token;
return done();
}
};
}
loginUser(user, request, auth)(function() {
request.get(testUrl)
.set('Authorization', `bearer ${auth.token}`)
.expect(200, done);
});
像这样使用异步/等待(没有回调):
auth = await loginUser(user, request);
request.get(testUrl)
.set('Authorization', `bearer ${auth.token}`)
.expect(200, done);
但我正在努力 returning / 设置 auth
是否正确(如果我将 auth
作为参数或 return 值传递并不重要)。
我试过的是这样的:
async function loginUser(user, request) {
let auth;
await request
.post('/users/login')
.send(credentials)
.expect(200)
.end(onResponse);
function onResponse(err, res) {
auth.token = res.body.token;
}
return auth;
}
但是 auth
从未正确设置。
问题在于,由于 Nodejs 中的事件循环,onResponse 方法的执行时间比函数的 return 晚。因此,您必须在收到数据时准确解决承诺
方法 loginUserInternal 可能是这样的:
function loginUserInternal(user, request) {
return new Promise((resolve,reject) => {
let auth = {};
request
.post('/users/login')
.send({
username: user.username,
password: user.password_decoded,
})
.expect(200)
.end(onResponse);
function onResponse(err, res) {
if(err) return reject(err)
auth.id = res.body.id;
auth.token = res.body.token;
auth.tokenExpires = res.body.tokenExpires;
resolve(auth)
}
})
}
并像使用 async await 一样调用它。
不要使用 'end' 语法,那是回调:
const response = await request.post(...)
.expect(200)
const {body: {token}} = response
return token
基本上它应该看起来像同步代码