使用Q来使用Node.js服务器链接数据库查询

时间:2015-06-30 02:56:06

标签: javascript node.js express q

首先,我仍然在学习承诺,所以我真的可以在这方面使用一些帮助。我有:

            request.get(options, function(error, response, body) {
                connection.query('SELECT * FROM `users` WHERE `spotify_id` = ' + body.id, function(error, results, fields) {
                    var getIdQuery = 'SELECT `id` FROM `users` WHERE `spotify_id` = ' + body.id;
                    if (results.length != 0) {
                        console.log("this user already exists");
                        connection.query(getIdQuery, function(error, results, fields) {
                            tokenAndId['id'] = results[0]['id'];
                            defer.resolve(tokenAndId);
                        });
                    } else {
                        var setUserQuery = 'INSERT INTO `users` (`spotify_id`) VALUES (' + body.id + ');';
                        connection.query(setUserQuery, function(){
                            connection.query(getIdQuery, function(error, results, fields) {
                                defer.resolve(tokenAndId);
                            }
                        });

所以在这个块中,我查询了我的数据库,根据他们的spotify ID查找用户是否存在(用户必须先登录才能在我的应用程序上找到它,所以我用它来检查它们是否已经存在于我的应用程序中数据库也是如果它在我的数据库中找到spotify ID然后它抓取行中的信息然后defer.resolve转到defer.promise.then,其中数据返回到客户端。

我遇到的问题是在else语句中,如果用户不存在,则为它们插入一行。这个插件现在可以正常工作,但我还需要另一个查询,以便在我创建行之后从中获取信息,以便客户端可以使用数据库ID。我正在努力尝试在Insert之后执行获取ID查询。目前,在这段代码中,我正在尝试回调以后执行,但它无法正常工作。我已经尝试过使用.then但我现在有点卡住了。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

你确实可以使用承诺,如下:

var Q = require('q');

function getId() {
  console.log('Getting id...');
  var deferred = Q.defer();
  request.get(options, function(error, response, body) {
    if (error) return deferred.reject(error);
    deferred.resolve(body.id);
  });
  return deferred.promise;
}

function getUserExists(id) {
  console.log('Getting user exists for', id, '...');
  var deferred = Q.defer();
  connection.query('SELECT * FROM `users` WHERE `spotify_id` = ' + id, function(error, results, fields) {
    if (error) return deferred.reject(error);
    deferred.resolve(results.length != 0);
  });
  return deferred.promise;
}

function getUserId(id) {
  console.log('Getting user id for', id, '...');
  var deferred = Q.defer();
  connection.query('SELECT `id` FROM `users` WHERE `spotify_id` = ' + id, function(error, results, fields) {
    if (error) return deferred.reject(error);
    if (results.length === 0) return deferred.reject(new Error('User not found'));
    deferred.resolve(results[0]['id']);
  });
  return deferred.promise;
}

function insertUser(id) {
  console.log('Inserting user for', id, '...');
  var deferred = Q.defer();
  connection.query('INSERT INTO `users` (`spotify_id`) VALUES (' + id + ');', function(error) {
    if (error) return deferred.reject(error);
    deferred.resolve(id);
  });
  return deferred.promise;
}

getId()
    .then(function(id) {
      return getUserExists(id)
          .then(function(userExists) {
            if (userExists) {
              return Q.when(id);
            } else {
              return insertUser(id);
            }
          })
    })
    .then(function(id) {
      return getUserId(id);
    })
    .then(function(userId) {
      console.log('Found user id', userId);
      tokenAndId['id'] = userId;
      return Q.when(tokenAndId);
    })
    .then(function(tokenAndId){
      //do something with tokenAndId
      console.log(tokenAndId);
    })
    .fail(function(error){
      //Oups! Error! Handle it here...
      console.error(error);
    })
    .done();