簡體   English   中英

使用Q鏈接使用Node.js服務器的數據庫查詢

[英]Using Q to chain Database queries using Node.js server

首先,我仍在學習諾言,因此我可以在此方面提供一些幫助。 我有:

            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,因此我使用它來檢查他們是否也已經存在於我的數據庫中),如果它在我的數據庫中找到了Spotify ID,則它將獲取該行中的信息,然后defer.resolve轉到defer.promise.then,然后將數據返回給客戶端。

我遇到的問題是在else語句中,如果用戶不存在,它將為他們插入一行。 此插入現在可以正常工作,但是創建行后,我還需要再次查詢以從中獲取信息,以便客戶端可以使用數據庫ID。 我正在努力讓get ID查詢在插入后執行。 當前,在這段代碼中,我正在嘗試在之后執行回調,但是它不起作用。 我也嘗試過使用.then,但現在有點卡住了。 謝謝你的幫助!

您確實可以使用諾言,如下所示:

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM