gpt4 book ai didi

javascript - 使用 Q 通过 Node.js 服务器链接数据库查询

转载 作者:太空宇宙 更新时间:2023-11-04 00:53:34 26 4
gpt4 key购买 nike

首先,我仍在学习 Promise,因此我确实可以在这方面使用一些帮助。我有:

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

因此,在这个 block 中,我查询数据库,根据其 Spotify ID 查找用户是否存在(用户必须首先在我的应用程序上登录 Spotify,因此我使用它来检查它们是否也已存在于我的数据库中),如果它在我的数据库中找到 Spotify ID,则它会获取该行中的信息,然后 defer.resolve 转到 defer.promise.then,其中数据将返回到客户端。

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

最佳答案

您确实可以使用 promise ,如下所示:

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

关于javascript - 使用 Q 通过 Node.js 服务器链接数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31128777/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com