[英]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.