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

基本上它应该看起来像同步代码