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

要开始,我还在学习承诺,所以我真的可以用一些帮助。 我有:

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(用户必须先login才能在我的应用程序中进行检测,所以我使用它来检查他们是否已经存在于我的数据库中),如果它在我的数据库中findspotify ID,那么它抓取行中的信息,然后defer.resolve进入一个defer.promise.then数据返回到客户端。

我遇到的问题是在else语句中,如果用户不存在,则为其插入一行。 这个插入现在正确地工作,但我也需要做另一个查询来获取它创build行后的信息,以便客户端可以使用数据库ID。 我正在努力尝试获取插入后执行的获取ID查询。 目前,在这个代码中,我试图callback执行之后,但它不工作。 我试过使用。然后,我现在有点卡住了。 谢谢你的帮助!

你确实可以使用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();