दिलचस्प पोस्ट
पीडीओ के लिए real_escape_string () के बराबर क्या है? उद्देश्य-सी के लिए मैं NSArray पार्सर को एक सीएसवी कहां मिल सकता हूं? एकाधिक डेलिमिटर के साथ स्प्लिट स्ट्रिंग्स? अंतरराष्ट्रीय भौगोलिक पते एक रिलेशनल डेटाबेस में कैसे संग्रहीत किए जाएंगे? क्या एक कंपाइलर बग है जो कि एक is_complete प्रकार के गुण के कार्यान्वयन से उत्पन्न हुआ है? रेडयुक्स ऐप में स्थानीय स्टॉरेज को कहाँ लिखना है? कोणीयफायर 2 डेटाबेस में शामिल होने के लिए कैसे करें एक आइफ्रेम के अंदर HTML डालकर (जावास्क्रिप्ट का उपयोग करके) मैं एक फ़ाइल की सामग्री से एक जावा स्ट्रिंग कैसे बनाऊं? लिनक्स में एक धागा नाम कैसे करें? Segue आईओएस 8 में काम नहीं खोलना d3 सर्कल में पाठ जोड़ें स्ट्रिंग से सभी गैर-अल्फ़ा संख्यात्मक वर्ण कैसे निकालें? ब्रॉडकास्ट रीसिसर को अपंजीकृत करने के लिए कैसे करें आरएसए ब्लॉक के लिए बहुत अधिक डेटा विफल पीकेएसीएस # 7 क्या है?

नोडज एक्सप्रेस और जो मैं उम्मीद करता हूं वह नहीं करता

मैं नोडजेएस का उपयोग कर एक लॉगिन एपीआई बनाने की कोशिश कर रहा हूं, लेकिन मेरा कोड ऐसा नहीं कर रहा है जो मैं इसे उम्मीद करता हूं। मैं जेएस के लिए बहुत नया हूँ, वादे करता हूं और सब कुछ कृपया यदि संभव हो तो कोई उत्तर सरल करें।

मेरे कोड के आउटपुट में मैं जो देख सकता हूं, पहला findUsers(...) भाग इंतजार नहीं करता जब तक कि फंक्शन findUsers(...) समाप्त नहीं हो जाता।

मेरे पास एक रूट फाइल है जहां मैं कुछ फ़ंक्शंस क्रमिक रूप से चलाना चाहता हूं:

  1. पता करें कि उपयोगकर्ता डाटाबेस में मौजूद है या नहीं
  2. यदि (1 सच है) हैश और इनपुट पासवर्ड नमक
  3. … आदि

मार्ग फाइलों में अब शामिल हैं:

 var loginM = require('../models/login'); var loginC = require('../controllers/login'); var Promise = require('promise'); module.exports = function(app) { app.post('/login/', function(req, res, next) { var promise = new Promise(function (resolve, reject) { var rows = loginM.findUser(req.body, res); if (rows.length > 0) { console.log("Success"); resolve(rows); } else { console.log("Failed"); reject(reason); } }); promise.then(function(data) { return new Promise(function (resolve, reject) { loginC.doSomething(data); if (success) { console.log("Success 2"); resolve(data); } else { console.log("Failed 2"); reject(reason); } }); }, function (reason) { console.log("error handler second"); }); }); } 

और findUser फ़ंक्शन में पूलिंग और एक क्वेरी होती है और यह एक मॉडल फ़ाइल में है:

 var connection = require('../dbConnection'); var loginC = require('../controllers/login'); function Login() { var me = this; var pool = connection.getPool(); me.findUser = function(params, res) { var username = params.username; 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; //}); }); } } module.exports = new Login(); 

मुझे आउटपुट प्राप्त है:

 Server listening on port 3000 Something is happening error handler second Connection 

तो मैं इस कोड के बारे में जानना चाहता हूं कि दो गुणा है:

  1. पहली findUser क्यों नहीं है अगर findUser को वापस जाने से पहले वापस जाने की प्रतीक्षा नहीं है तो / या और इसके लिए मुझे क्या करने की आवश्यकता है?
  2. error handler second क्यों आउटपुट हुआ लेकिन Failed नहीं हुआ?

मुझे लगता है कि वादे के बारे में पूरी तरह गलतफहमी है मैं किसी भी जवाब के लिए आभारी हूं। धन्यवाद।

Solutions Collecting From Web of "नोडज एक्सप्रेस और जो मैं उम्मीद करता हूं वह नहीं करता"

कोड के साथ मुद्दे

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

  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 पास होने के तुरंत बाद, फ़ंक्शन को पास करने के बाद 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() आपके कॉलबैक या otherCode() हैंडलर्स को पंजीकृत करने के तुरंत बाद चलाए जायेंगे, इससे पहले कि क्वेरी में कोई डेटा है – जो कि कोई अवरोधन नहीं किया जाना है।

सारांश

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

असल में मैंने इस अवधारणा को स्पष्ट करने के लिए माध्यम पर एक छोटी कहानी लिखी: ग्रह असिन्रोनिया 256/16 पर गैर ब्लैकिंग आई / ओ – अनिश्चित तथ्यों पर आधारित एक छोटी सी कहानी ।