2015-09-29 22 views
6

Çalıştığım bir web sitesi için bir kullanıcı kayıt sistemi oluşturmak için çalışıyorum ancak birkaç sorunla karşılaşıyorum. Ben düğüm-mysql BuradaNode.js MySQL ile eşzamanlı sorgular

ile senkron sorguları oluşturmak için bir yol olup olmadığını bulmaktır yardıma gerekenler Bir tür pis alır çünkü yuva geri aramaları zorunda uzak durmaya çalışıyorum

, ne var ben Başarmaya çalışıyorum.

connection.query("select 1 as email from users where email = " + connection.escape(email), function(err, rows, fields) { 
    if(err) { 
     var error = { 
      error_message: err.code, 
      error_number: err.errno 
     }; 

     return res.send(error); 
    } 

    if(rows.length > 0) { 
     var error = { 
      message: 'Email Address is Taken', 
      code: 2 
     }; 
     return res.send(error); 
    } 
}); 

connection.query("insert into users (email, password) values ("+connection.escape(email)+", "+connection.escape(hash)+")", function(err, rows, fields) { 
      if(err) { 
       var error = { 
        error_message: err.code, 
        error_number: err.errno 
       }; 

       return res.send(error); 
      } 
     }); 

Amacım ilk sorgu çalıştırmak sahip olmaktır ve bu bir satır döndürürse sonra ikinci sorguyu yürütmek değil ama ilk sorgu 0 satır döndürürse ardından devam ve ikinci sorguyu çalıştırın.

İkinci sorguyu ilk sorguya yerleştirebiliyorum ve başka bir şeyde koymalıyım ama yapmak istemediğim şey bu çünkü iki sorgulama yaparken de bcrypt'i şifrelemek için kullanıyorum. aynı zamanda iç içe olması gereken parola.

İki sorguyu yerleştirmem ya da onları tek seçeneğim olacak şekilde yerleştirmeme gerek kalmaması için yazmanın bir yolu var mı?

+0

: ' şifre''. –

+0

Yuvalamayı kullanmanıza gerek yok. Async şelalesini kullanabilir ve adımlar arasında doğru/yanlış bir değişken iletebilirsiniz. İkinci sorguyu çalıştırmak istemezseniz, ilkinden yanlış iletmeniz yeterlidir. – CargoMeister

+4

node.js'de geliştirilecekseniz, node.js'nin temel bir mimari öğesi olduğundan iyi bir uyumsuz kod yazmayı öğrenmek zorunda kalacaksınız ve bir sunucu oluşturuyorsanız, asenkron işlemleri kullanmak zorundasınız. Sunucu duyarlılığı ve ölçeklenebilirlik hissini korumak. Şimdi başlayabilirsin. Sözleri nasıl kullanacağınızı öğrenmenizi öneririm, böylece yuva yerine sıralı işlemleri zincirleyebilir ve bir tonu daha kolay işlemede hata yapar. – jfriend00

cevap

9

Yukarıdaki gibi jfriend00 dediğimiz gibi, eğer node.js içinde geliştirilecekseniz, o zaman uyumsuz kod yazarken rahat olmalısınız.

"zincirleme sözler" muhtemelen en iyi bahistir:

EK:

Bu öğretici node.js ile zincirleme sözünü göstermektedir SQL sorguları. Ayrıca kodunuzu basitleştirmek için Q kullanabilir ve/veya Step nasıl anlatılır: Sadece senkron işlevleri sağlamak düğüm için bir modül kullanabilirsiniz

+0

Örnekler için teşekkürler. Öyleyse, sözleri kullanacak olursam yapmaya çalıştığım şey için, nasıl devam edersem sorgularimi yerleştirmek zorunda kalmam. Bu son örnekten kodumun sözlerini uygulamaya başladım ve şu ana kadar var olan Q.ninvoke (db, "query", "SELECT 1 e-mail_exists FROM kullanıcıları WHERE email = '+ db.escape (email)) .ve (fonksiyonu (satırlar) { halinde (satırlar [0] .length> 0) { hatası = { hata_iletisi: 'E-posta adresi çekilmeden', error_code: 8 }; res.end (hata) } }) 'ancak ikinci sorguyu yine de –

+0

'da bulunan ikinci ifadede iç içe geçirmem gerekmiyor veya ikinci sorguyu başka bir .then (function() {}); ilkinden sonra mı? –

10

. Burada mysql ile başa çıkmak için senkronizasyon/uyumsuzluk işlevleri sağlayan bir modül bulacaksınız. node.js birçok şey ben kodu için

var config = require("./config.json") ; 
var mysql = require('mysql-libmysqlclient') ; 
var client = mysql.createConnectionSync(config.host, config.user, config.password, config.database) ; 

var query = "SELECT * FROM Users ;" ; 
var handle = client.querySync(query) ; 
var results = handle.fetchAllSync() ; 

console.log(JSON.stringify(results)) ; 
+0

Bunun için teşekkürler! Bir grup redüktöre zincirleme için senkron bir lib'a ihtiyacım vardı. –

+0

bu kabul edilen yanıt olmalıdır –

+0

Bir yan not olarak, bir redüktör, argümanlarına dayanarak tutarlı bir değer veren saf bir işlev değilse, gerçek bir indirgeyici (diğer şeylerin kolayca test edilebilme yeteneğini kaybeder) değildir. Hiçbir yan etki yok, harici bir kaynaktan veri alma yok. –

1

, ben asenkron kod istiyorum: Burada

https://github.com/Will-I4M/node-mysql-libmysqlclient

zaman uyumlu bir sorguyu yürütmek için nasıl kullanılacağını olduğunu. Bununla birlikte, asenkron kodun iş mantığını yazma ve sürdürme gereği ile son derece ve tehlikeli bir şekilde uyumsuz olduğunu anlıyorum. Çeşitli alternatif yöntemler kullandım. İşleri eşzamanlı hale getirecek modüller, sizi bir şeyleri karmaşıklaştıran veri kapsamı sorunları ile birlikte bırakıyor. Vaatler benim için en iyi çalıştı. Bu yaklaşımı kullanarak, pratik olarak JavaScript'in üzerine yeni bir dil için bir tercüman yazarken buldum. Saçma görünebilir ama benim için en pratik ve en güvenli yöntem, shelljs modülünü ve mysql kabuk istemcisini kullanmak oldu.Bu, harika bir yürütme performansı değil, daha iyi bir geliştirici performansı sağlıyor ve iş mantığı için hayati öneme sahip olduğu gibi, iş mantığını açık ve düzenli tutuyor. Oluşturduğum şeyin bir örneğini vermek için kod pasajı:

var shell = require ('shelljs');

module.exports = { kullanıcı: 'Onları yuvalarına sahip

runSql:function(sql) { 
      var command = "echo '" + sql.replace(/'/g,"'\\''") + "' | mysql -u" + this.user.replace(/'/g,"'\\''") + " -p'" + this.password.replace(/'/g,"'\\''") + "'"; 
      var raw = shell.exec(command, {silent:true}).stdout; 
      //console.log('BASH -> MySQL YIELD: "' + raw + '"'); 
      if(raw.substr(0,5) === 'ERROR') { 
        console.log('ERROR Resulting from: ' + sql + '\n' + raw); 
        return []; 
      } 
      var rows = raw.split('\n'); 
      var names = []; 
      for(var r = 0; r < rows.length; r += 1) { 
        columns = rows[r].split('\t'); 

        // Capture column names 
        if(r === 0) { 
          names = columns; 
          continue; 
        } 

        // Reformat row into named valued 
        var fields = {}; 
        for(var c = 0; c < columns.length; c += 1) { 
          fields[names[c]] = columns[c]; 
        } 
        rows[r] = fields; 
      }; 

      // Eliminate extraneous first and last rows 
      rows.splice(0,1); 
      rows.splice(rows.length-1,1); 

      return rows; 
    }, 
+0

Daha sonra, bir hatayla sonuçlanıp sonuçlanmadığını kontrol etmek için bir şey ekledim ... Ayrıca, MySQL'in "tablename" komutunu kullanarak tablo tasarım bilgisini almak için bu yöntemi kullanan başka bir yöntem yazdım. Harika çalışıyor. İhtiyacı anlamayan insanlar tarafından savunulan teknik açıdan daha doğru yaklaşımları denemek için çok fazla acı çektikten sonra, kendimi bu şekilde yaparak yaşayabilirim. En sonunda, birisinin hem senkron hem de asenkronize yöntemler sunan bir MySQL modülü yazması gerekiyor. Şahsen, gerçekten de JavaScript'in "birlikte" {..} "ve" siparişte {..} "ifadeleri olduğunu diliyorum. – user1018645