Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Nodejs व्यक्त करते हैं और जो मैं उम्मीद करता हूं वह नहीं करने का वादा करता है

कोड से जुड़ी समस्याएं

ठीक है, यहाँ बहुत सारी समस्याएँ हैं इसलिए सबसे पहले चीज़ें पहले करें।

        connection.query('...', function (err, rows) {
            connection.release();
            if (!err) {
                return rows;
            } else {
                return false;
            }
        });

यह काम नहीं करेगा क्योंकि आप कॉलर को डेटा लौटा रहे हैं, जो डेटाबेस क्वेरी है जो आपके कॉलबैक को err के साथ कॉल करती है और rows और आपके कॉलबैक के वापसी मूल्य की परवाह नहीं करता है।

आपको जो करने की आवश्यकता है वह यह है कि जब आपके पास पंक्तियाँ हों या जब आपके पास न हो तो किसी अन्य फ़ंक्शन या विधि को कॉल करें।

आप कॉल कर रहे हैं:

var rows = loginM.findUser(req.body, res);

और आप वहां पंक्तियां प्राप्त करने की अपेक्षा करते हैं, लेकिन आप नहीं करेंगे। आपको जो मिलेगा वह है undefined और आप इसे डेटाबेस क्वेरी की तुलना में तेज़ी से प्राप्त करेंगे। यह इस तरह काम करता है:

me.findUser = function(params, res) {
    // (1) you save the username in a variable
    var username = params.username;

    // (2) you pass a function to getConnection method
    pool.getConnection(function (err, connection) {
        console.log("Connection ");

        if (err) {
            console.log("ERROR 1 ");
            res.send({"code": 100, "status": "Error in connection database"});
            return;
        }

        connection.query('select Id, Name, Password from Users ' +
            'where Users.Name = ?', [username], function (err, rows) {
            connection.release();
            if (!err) {
                return rows;
            } else {
                return false;
            }
        });

        //connection.on('error', function (err) {
        //    res.send({"code": 100, "status": "Error in connection database"});
        //    return;
        //});
    });

    // (3) you end a function and implicitly return undefined
}

pool.getConnection किसी फ़ंक्शन को पास करने के तुरंत बाद विधि वापस आ जाती है, इससे पहले कि डेटाबेस से कनेक्शन भी हो जाए। फिर, कुछ समय बाद, उस फ़ंक्शन को कॉल किया जा सकता है जिसे आपने उस विधि में पास किया है, लेकिन यह आपके द्वारा undefined लौटने के बाद लंबा होगा उस कोड के लिए जो इसमें एक मान चाहता था:

var rows = loginM.findUser(req.body, res);

कॉलबैक से मान वापस करने के बजाय आपको उनसे कुछ अन्य फ़ंक्शंस या विधियों को कॉल करने की आवश्यकता है (जैसे कुछ कॉलबैक जिन्हें आपको कॉल करने की आवश्यकता है, या किसी वादे को हल करने की विधि)।

मान लौटाना एक सिंक्रोनस अवधारणा है और यह एसिंक्रोनस कोड के लिए काम नहीं करेगा।

वादों का उपयोग कैसे किया जाना चाहिए

अब, यदि आपके फ़ंक्शन ने एक वादा . लौटाया है :

me.findUser = function(params, res) {
    var username = params.username;

    return new Promise(function (res, rej) {

      pool.getConnection(function (err, connection) {
        console.log("Connection ");

        if (err) {
          rej('db error');
        } else {
          connection.query('...', [username], function (err, rows) {
            connection.release();
            if (!err) {
                res(rows);
            } else {
                rej('other error');
            }
        });
      });
    });
}

तब आप इसे अपने कोड के किसी अन्य भाग में इस प्रकार उपयोग कर सकेंगे:

app.post('/login/', function(req, res, next) {

    var promise = new Promise(function (resolve, reject) {

        // rows is a promise now:
        var rows = loginM.findUser(req.body, res);

        rows.then(function (rowsValue) {
            console.log("Success");
            resolve(rowsValue);
        }).catch(function (err) {
            console.log("Failed");
            reject(err);
        });
    });
    // ...

स्पष्टीकरण

संक्षेप में, यदि आप एक डेटाबेस क्वेरी की तरह एक एसिंक्रोनस ऑपरेशन चला रहे हैं - तो आपके पास तुरंत इस तरह का मान नहीं हो सकता है:

var value = query();

क्योंकि सर्वर को असाइनमेंट निष्पादित करने से पहले डेटाबेस के लिए प्रतीक्षा को अवरुद्ध करने की आवश्यकता होगी - और सिंक्रोनस के साथ प्रत्येक भाषा में यही होता है, I/O को अवरुद्ध करता है (इसीलिए आपको उन भाषाओं में धागे रखने की आवश्यकता होती है ताकि अन्य चीजें हो सकें किया गया, जबकि वह धागा अवरुद्ध है)।

नोड में आप या तो एक कॉलबैक फ़ंक्शन का उपयोग कर सकते हैं जिसे आप डेटा होने पर कॉल करने के लिए एसिंक्रोनस फ़ंक्शन को पास करते हैं:

query(function (error, data) {
  if (error) {
    // we have error
  } else {
    // we have data
  }
});
otherCode();

या आपको कोई वादा मिल सकता है:

var promise = query();
promise.then(function (data) {
  // we have data
}).catch(function (error) {
  // we have error
});
otherCode();

लेकिन दोनों ही मामलों में otherCode() आपके कॉलबैक या वादे संचालकों को पंजीकृत करने के तुरंत बाद चलाया जाएगा, इससे पहले कि क्वेरी में कोई डेटा हो - यानी कोई अवरोधन नहीं करना है।

सारांश

संपूर्ण विचार यह है कि Node.JS जैसे अतुल्यकालिक, गैर-अवरुद्ध, एकल-थ्रेडेड वातावरण में आप कभी भी एक समय में एक से अधिक काम नहीं करते हैं - लेकिन आप बहुत सी चीजों की प्रतीक्षा कर सकते हैं। लेकिन आप केवल किसी चीज़ की प्रतीक्षा नहीं करते हैं और प्रतीक्षा करते समय कुछ भी नहीं करते हैं, आप अन्य चीज़ों को शेड्यूल करते हैं, और चीज़ों की प्रतीक्षा करते हैं, और अंततः जब यह तैयार हो जाता है तो आपको वापस बुला लिया जाता है।

वास्तव में मैंने उस अवधारणा को स्पष्ट करने के लिए माध्यम पर एक लघु कहानी लिखी:असिंक्रोनिया256/16 ग्रह पर गैर-ब्लैकिंग I/O - अनिश्चित तथ्यों पर आधारित एक छोटी कहानी




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP और mySQL:वर्ष 2038 बग:यह क्या है? इसे कैसे हल करें?

  2. MySQL:ALTER IGNORE TABLE अखंडता बाधा उल्लंघन देता है

  3. मॉडलिंग उत्पाद प्रकार

  4. ClusterControl वर्चुअल IP को कैसे कॉन्फ़िगर करता है और विफलता के दौरान क्या अपेक्षा की जाती है

  5. अनुमानित पंक्तियों की गणना phpmyadmin परिणामों में बहुत भिन्न क्यों है?