repo-utils/gitlab

Promises don't seem to work

konsumer opened this issue · 5 comments

In node v7.2.0, code like this works:

client.projects.list({}, (err, projects) => {
  if (err) throw err
  console.log(projects)
})

But with this:

client.projects.list({})
  .then(projects => console.log(projects))
  .catch(err => { throw err })

I get this error:

/Users/konsumer/Desktop/migrate-git/migrate.js:45
  .then(milestones => console.log(milestones))
  ^

TypeError: Cannot read property 'then' of undefined
    at Object.<anonymous> (/Users/konsumer/Desktop/migrate-git/migrate.js:45:3)
    at Module._compile (module.js:571:32)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
    at Module.runMain (module.js:605:10)
    at run (bootstrap_node.js:420:7)
    at startup (bootstrap_node.js:139:9)
    at bootstrap_node.js:535:3

It seems like promises don't work with several others, as well.

zivni commented

Tested the following in node v7.4.0 and it works.

did you use gitlab.createPromise?

var gitlab = require('node-gitlab');

var client = gitlab.createPromise({
    api: 'http://gitlab..../api/v3',
    privateToken: 'z....m'
});

client.projects.list({})
    .then(p => console.log(JSON.stringify(p)))
    .catch(err => console.error(err))

ah, nope. thanks!

Sweet :)

I've been having problems with Promises as well...
Added the commitActions method to repository. Please let's get this method added! Help me out :) This is a nightmare/jungle. Spent all day...

my fork

gitlabl: create a commit with multiple files and actions

Finally got it working, but only in callback mode. I need promises to work with the rest of my code!

  it('should commit a list of actions', function (done) {
    console.log(`repository.commitActions`, client.id)
    let random = Math.floor((Math.random() * 1000) + 1)
    client.repository.commitActions({
      id: client.id,
      // branch_name: 'develop', for v3 API
      branch: 'develop',
      actions: [{
        action: 'create',
        file_path: `foolish-${random}`,
        content: 'some content'
        // encoding: 'text'
      }],
      // author_email: 'test@gmail.com',
      // author_name: 'tester',
      commit_message: 'goodies'
    }, function (err, res) {
      console.log('RETURNED', {
        err,
        res
      })
      should.not.exists(err);
      should.exists(res);
      done();
    })
  })

However if I wrap it in a Promise, I always get this error:

{ Gitlab400Error: You can only create or edit files when you are on a branch
    at Gitlab.RESTFulClient.handleResult (/Users/kristianmandrup/repos/tecla5/gitlab/node_modules/restful-client/lib/client.js:86:11)
    at /Users/kristianmandrup/repos/tecla5/gitlab/node_modules/restful-client/lib/client.js:166:10
    at done (/Users/kristianmandrup/repos/tecla5/gitlab/node_modules/urllib/lib/urllib.js:266:5)
    at /Users/kristianmandrup/repos/tecla5/gitlab/node_modules/urllib/lib/urllib.js:440:9
    at IncomingMessage.<anonymous> (/Users/kristianmandrup/repos/tecla5/gitlab/node_modules/urllib/lib/urllib.js:416:7)

Even when wrapping manually:

    function errorAndReject(err, reject) {
      console.error(err)
      reject(err)
    }

    function commitActionsPromised(data) {
      return new Promise((resolve, reject) => {
        client.repository.commitActions(data, (err, result) => {
          err ? reject(err, reject) : resolve(result)
        })
      })
    }

    // essentially should be same as:
    // client.promise.repository.commitActions
    commitActionsPromised({
        id: client.id,

Any idea? I also tried using client.promise.repository.commitActions ensuring the commitActions was added to repositories object of properties.js to be picked up by promisifyAll

My before and after to create and cleanup test project (i.e client.id)

const cleanupTimeout = 1000

  before(function (done) {
    // use API v4 ??
    // See: https://docs.gitlab.com/ce/api/v3_to_v4.html
    // process.env.NODE_GITLAB_API = 'https://gitlab.com/api/v4'

    console.log('before suite, create fresh test project to be used :)')
    client.createProject(function (err) {
      console.log(`test project created: ${client.id}`)
      console.log(`Ready for action!`)
      done();
    });
  });

  // Seems to work only if I don't clean up (remove) project after.
  // Looks like a race condition!?
  after((done) => {
    // Try cleanup 5secs after tests done
    setTimeout(() => {
      console.log(`Cleaning up!!!`)
      client.removeProject()
      console.log(`DONE Clean up!!!`)
      done()
    }, cleanupTimeout)
  });

I also experienced racing condition on after cleanup, so I set a 1 sec wait.

Turns out the weird error was most likely due to slow/bad wifi connection. When I moved my laptop closer to the router this morning, it all worked as expected :)