আমি মঙ্গুজ কোডের এক টুকরো জুড়ে এসেছি যার মধ্যে একটি কোয়েরি ফাইন্ডওন এবং তারপরে একটি এক্সিকিউট () ফাংশন অন্তর্ভুক্ত রয়েছে।
আমি জাভাস্ক্রিপ্টে এর আগে কখনও সে পদ্ধতিটি দেখিনি? এটা ঠিক কি করে?
আমি মঙ্গুজ কোডের এক টুকরো জুড়ে এসেছি যার মধ্যে একটি কোয়েরি ফাইন্ডওন এবং তারপরে একটি এক্সিকিউট () ফাংশন অন্তর্ভুক্ত রয়েছে।
আমি জাভাস্ক্রিপ্টে এর আগে কখনও সে পদ্ধতিটি দেখিনি? এটা ঠিক কি করে?
উত্তর:
মূলত মঙ্গুজ ব্যবহার করার সময়, সহায়কগুলি ব্যবহার করে নথিগুলি পুনরুদ্ধার করা যেতে পারে। ক্যোয়ারী শর্তাদি গ্রহণ করে এমন প্রতিটি মডেল পদ্ধতি কোনও callback
বা exec
পদ্ধতির মাধ্যমে কার্যকর করা যেতে পারে ।
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
সুতরাং আপনি যখন কলব্যাক পাস না করেন আপনি একটি ক্যোয়ারী তৈরি করতে পারেন এবং শেষ পর্যন্ত এটি কার্যকর করতে পারেন।
আপনি অতিরিক্ত তথ্য খুঁজে পেতে পারেন মঙ্গুজ ডক্সে ।
হালনাগাদ
মোঙ্গুজ অ্যাসিঙ্ক অপারেশনের সাথে সংমিশ্রণে প্রতিশ্রুতি ব্যবহার করার সময় লক্ষ্য করার মতো বিষয়টি মঙ্গুসের অনুসন্ধানগুলি প্রতিশ্রুতি নয় । অনুসন্ধানগুলি একটি তাত্ক্ষণিক ফিরিয়ে দেয় তবে আপনার যদি সত্যিকারের প্রতিশ্রুতির প্রয়োজন হয় তবে আপনার exec
পদ্ধতিটি ব্যবহার করা উচিত । আরও তথ্য এখানে পাওয়া যাবে ।
আপডেটের সময় আমি লক্ষ্য করেছি যে আমি স্পষ্টভাবে প্রশ্নের উত্তর দিলাম না:
আমি জাভাস্ক্রিপ্টে এর আগে কখনও সে পদ্ধতিটি দেখিনি? এটা ঠিক কি করে?
ওয়েল এটা না একটি নেটিভ জাভাস্ক্রিপ্ট পদ্ধতি, কিন্তু নকুল API- এর অংশ।
exec
পদ্ধতিটি কল করতে হবে । তারা ডকসনে কমপক্ষে এটি করে। নিশ্চিত হয়ে আপনি নিজের সাথে চেক করতে পারেন Model.find() instanceof require('bluebird')
। আশাকরি এটা সাহায্য করবে.
Model.update().exec()
এটি কার্যকর করা হবে তা আপনার নিশ্চিত করা দরকার । তারপরে আপনি আপডেটের জন্য অপেক্ষা না করে এপিআইকে প্রতিক্রিয়া জানাতে পারেন।
ড্যানিয়েল এর সুন্দর উত্তর দিয়েছেন। ক্যোয়ারীগুলি তৈরি ও সম্পাদন করার উপায়গুলির বিশদ তালিকার বিশদটি জানাতে, নিম্নলিখিত ব্যবহারের ক্ষেত্রে দেখুন:
অনুসন্ধান বিল্ডিং
নকুল পর্যন্ত একটি ক্যোয়ারী নির্বাহ করা হবে না then
বা exec
এটি উপর বলা হয়েছে। জটিল প্রশ্নগুলি তৈরি করার সময় এটি খুব দরকারী। কিছু উদাহরণের মধ্যে populate
এবং aggregate
কার্যাদি অন্তর্ভুক্ত থাকতে পারে ।
User.find({name: 'John'}) // Will not execute
কলব্যাকের মাধ্যমে কার্যকর করা
যদিও তার নেস্টিং প্রকৃতির কারণে অনেকের দ্বারা অপছন্দ করা হয়েছে, quচ্ছিক কলব্যাক সরবরাহ করে কোয়েরিগুলি সম্পাদন করা যেতে পারে।
User.find({name: 'John'}, (err, res) => {}) // Will execute
তারপরে এপিআই প্রতিশ্রুতি হিসাবে / এ +
মঙ্গুজের অনুসন্ধানগুলি একটি then
ফাংশন সরবরাহ করে। এটি নিয়মিত প্রতিশ্রুতি দিয়ে বিভ্রান্ত হবে না। সোজা কথায়, প্রতিশ্রুতি / এ + নির্দিষ্টকরণের জন্য then
আমরা যেমন প্রতিশ্রুতি দিয়ে থাকি সেভাবে কাজ করার জন্য একটি ফাংশন প্রয়োজন ।
User.find({name: 'John'}).then(); // Will execute
Promise.all([User.find({name: 'John'}), User.find({name: 'Bob'})]) // Will execute all queries in parallel
এক্সিকিউটিভ ফাংশন
মঙ্গুজ ডক্স থেকে If you need a fully-fledged promise, use the .exec() function.
User.find({name: 'John'}).exec(); // Will execute returning a promise
then
একটি প্রতিশ্রুতিও ফেরত দিতে একটি প্রশ্নের উপরে ব্যবহার করতে পারেন । এটি এর চেয়ে আলাদা নয় exec
। ব্যবহারের ক্ষেত্রে আমি এই সহজটি খুঁজে পাই এরকম কিছু ব্যবহার করার সময় Promise.all
। exec
যদিও প্রতিশ্রুতি এই ধরনের প্রসঙ্গে কাজ করে কিনা তা নিশ্চিত নয় ।
exec()
কোনও কলব্যাক সরবরাহ না করা হলে একটি প্রতিশ্রুতি ফিরিয়ে দেবে। সুতরাং নিম্নলিখিত প্যাটার্নটি খুব সুবিধাজনক এবং জেনেরিক - এটি কলব্যাকগুলি বা দুর্দান্ত প্রতিশ্রুতিগুলি পরিচালনা করতে পারে:
function findAll(query, populate, cb) {
let q = Response.find(query);
if (populate && populate.length > 0) {
q = q.populate(populate);
}
// cb is optional, will return promise if cb == null
return q.lean().exec(cb);
}
আমি মঙ্গুজের সাথে ব্লুবার্ড প্রতিশ্রুতি ব্যবহার করার পরামর্শ দিচ্ছি, এটি করার জন্য, এই কলটি ব্যবহার করুন:
const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');