নোডজেএস আনহানডেলডপ্রাইম রিজেকশনস ওয়ার্নিং


134

সুতরাং, আমি এমন একটি উপাদান যা টেস্ট করছি যা ইভেন্ট-ইমিটারের উপর নির্ভর করে। এটি করতে আমি মোচা + চই সহ প্রতিশ্রুতি ব্যবহার করে একটি সমাধান নিয়ে এসেছি:

it('should transition with the correct event', (done) => {
  const cFSM = new CharacterFSM({}, emitter, transitions);
  let timeout = null;
  let resolved = false;
  new Promise((resolve, reject) => {
    emitter.once('action', resolve);
    emitter.emit('done', {});
    timeout = setTimeout(() => {
      if (!resolved) {
        reject('Timedout!');
      }
      clearTimeout(timeout);
    }, 100);
  }).then((state) => {
    resolved = true;
    assert(state.action === 'DONE', 'should change state');
    done();
  }).catch((error) => {
    assert.isNotOk(error,'Promise error');
    done();
  });
});

কনসোলে আমি একটি 'আনহানডেল্ডপ্রিমাইজেকশন ওয়ার্নিং' পাচ্ছি যদিও প্রত্যাখ্যান করা ফাংশনটি কল করা হচ্ছে কারণ এটি তাত্ক্ষণিকভাবে 'অ্যাসেরেশন এরিয়ার: প্রতিশ্রুতি ত্রুটি' বার্তাটি দেখায়

(নোড: 25754) আনহানডেল্ডপ্রাইম রিজেকশনস সতর্কতা: আনহানডেলড প্রতিশ্রুতি প্রত্যাখ্যান (প্রত্যাখ্যান ID: 2): দৃser়তা ত্রুটি: প্রতিশ্রুতি ত্রুটি: প্রত্যাশিত {অবজেক্ট (বার্তা, শোডিফ, ...) - মিথ্যা হতে হবে 1) সঠিক ইভেন্টের সাথে স্থানান্তরিত হওয়া উচিত

এবং তারপরে, 2 সেকেন্ডের পরে আমি পাই

ত্রুটি: 2000 মাইলের সময়সীমা অতিক্রম করেছে। নিশ্চিত হয়ে নিন যে সম্পন্ন () কলব্যাক এই পরীক্ষায় কল করা হচ্ছে।

যা ধরা কলব্যাক কার্যকর হওয়ার পর থেকে এটি আরও অদ্ভুত।

এখন মজার বিষয়, আমি যদি মন্তব্যটি করে মন্তব্য করি assert.isNotOk(error...)তবে কনসোলে কোনও সতর্কতা রয়েছে with এটি ক্যাচটি কার্যকর করে এই অর্থে স্থির করে 'ব্যর্থ'।
কিন্তু তবুও, আমি প্রতিশ্রুতি দিয়ে এই ত্রুটিগুলি বুঝতে পারি না। কেউ কি আমাকে আলোকিত করতে পারে?


আমি মনে করি আপনার কাছে খুব শেষ লাইনে বন্ধনী বন্ধনী এবং পেরেনগুলির একটি অতিরিক্ত সেট রয়েছে। এগুলি মুছুন এবং আবার চেষ্টা করুন।
Redu

4
এটি এত দুর্দান্ত, নতুন অযথিত প্রত্যাখ্যানের সতর্কতা বাস্তব জীবনে বাগগুলি খুঁজে পায় এবং লোকদের সময় বাঁচায়। এখানে অনেক জয়। এই সতর্কতা ছাড়াই আপনার পরীক্ষাগুলি কোনও ব্যাখ্যা ছাড়াই সময় শেষ হয়ে যেত।
বেনিয়ামিন গ্রুইনবাউম

উত্তর:


161

সমস্যাটি এর ফলে ঘটে:

.catch((error) => {
  assert.isNotOk(error,'Promise error');
  done();
});

যদি দৃ f়তা ব্যর্থ হয় তবে এটি ত্রুটি ছুঁড়ে দেবে। এই ত্রুটিটির কারণে done()কখনও কল করা হবে না, কারণ কোডটি এর আগেই ভ্রান্ত হয়। সময়সীমার কারণেই এটাই।

"অপরিচালিত প্রতিশ্রুতি প্রত্যাখ্যান" এছাড়াও, ব্যর্থ কথন দ্বারা ঘটিত হয় কারণ একটি ত্রুটি একটি নিক্ষিপ্ত হলে catch()হ্যান্ডলার, এবং সেখানে একটি পরবর্তী নয় catch()হ্যান্ডলার , ত্রুটি গ্রস্ত হবে (যেমন ব্যাখ্যা এই নিবন্ধটি )। UnhandledPromiseRejectionWarningসাবধানবাণী এই সত্য আপনার সতর্ক করা হয়।

সাধারণভাবে, আপনি যদি মোচায় প্রতিশ্রুতি-ভিত্তিক কোডটি পরীক্ষা করতে চান তবে আপনার এই সত্যের উপর নির্ভর করা উচিত যে মোচা নিজেই ইতিমধ্যে প্রতিশ্রুতিগুলি পরিচালনা করতে পারে। আপনি ব্যবহার করা উচিত নয় done(), পরিবর্তে, আপনার পরীক্ষা থেকে একটি প্রতিশ্রুতি ফিরে। মোচা তারপরে কোনও ত্রুটি নিজেই ধরবে।

এটার মত:

it('should transition with the correct event', () => {
  ...
  return new Promise((resolve, reject) => {
    ...
  }).then((state) => {
    assert(state.action === 'DONE', 'should change state');
  })
  .catch((error) => {
    assert.isNotOk(error,'Promise error');
  });
});

7
কৌতূহলী কারও জন্য, এটি জুঁইয়ের ক্ষেত্রেও সত্য।
নিক র‌্যাডফোর্ড

@ আরবার্টক্লেপ কি ধরবে না যে কোনও ত্রুটির জন্য ডাকা হবে এবং কেবল যেটি আপনি প্রত্যাশা করছেন তা নয়? আমি মনে করি আপনি ব্যর্থতা দৃsert় করার চেষ্টা করলে এই স্টাইলটি কার্যকর হবে না।
TheCrazyProgrammer

1
@ ক্রাইজি প্রোগ্রামার catchহ্যান্ডলারটি সম্ভবত দ্বিতীয় তর্ক হিসাবে পাস করা উচিত then। তবে, ওপির উদ্দেশ্য কী ছিল তা আমি পুরোপুরি নিশ্চিত নই , তাই আমি এটি যেমন রেখেছি তেমনি রেখেছি।
রবার্টক্লেপ

1
এবং জুঁই সম্পর্কে কৌতূহল কারও জন্য, done.fail('msg')এই ক্ষেত্রে ব্যবহার করুন ।
পাওয়ে

মূল কোড বনাম জোর দেওয়া কোথায় হওয়া উচিত তার পুরো উদাহরণ দিতে পারেন, এখানে এত পরিষ্কার নয় ..... বিশেষ করে যদি আপনি আমাদের কোডে মূল পরিষেবা / প্রতিশ্রুতি কল থেকে কোনও মূল্য জোর দিয়ে থাকেন। আমাদের কোডের জন্য প্রকৃত প্রতিশ্রুতি কি এই অন্যান্য "মোচা প্রতিশ্রুতি" এর মধ্যে যায় ??
বিজেএম 88

10

সিননের সাথে স্টাব করার সময় আমি এই ত্রুটিটি পেয়েছি।

সমাধানটি হ'ল এনবিএম প্যাকেজ সিনোন-যেমন-প্রতিশ্রুতিগুলি যখন স্টাবগুলির সাথে প্রতিশ্রুতিগুলি সমাধান বা প্রত্যাখ্যান করা হয় তখন ব্যবহার করা ।

পরিবর্তে ...

sinon.stub(Database, 'connect').returns(Promise.reject( Error('oops') ))

ব্যবহার করুন ...

require('sinon-as-promised');
sinon.stub(Database, 'connect').rejects(Error('oops'));

একটি সমাধানের পদ্ধতিও রয়েছে (শেষের দিকে নোট করুন)।

Http://clarkdave.net/2016/09/node-v6-6- এবং-asynchronously-handled-promise-rejections দেখুন


1
সিনন এখন সংস্করণ ২ হিসাবে স্টাবগুলির জন্য " সমাধানগুলি " এবং "প্রত্যাখ্যান" পদ্ধতিগুলি অন্তর্ভুক্ত করেছেন npmjs.com/package/sinon-as- প্রস্তাবিত দেখুন । আমি এখনও উত্তরটি +1 করেছি, যদিও - আমি এই সম্পর্কে জানতাম না।
অ্যান্ড্রু

9

দৃoc়তা সঠিক না হলে মোছার দৃ libra় গ্রন্থাগারগুলি ত্রুটি নিক্ষেপ করে কাজ করে। catchপদ্ধতিতে সরবরাহকারী নির্বাহী কার্যক্রমে নিক্ষেপ করা হলেও ত্রুটি ছুঁড়ে দেওয়া একটি প্রত্যাখ্যাত প্রতিশ্রুতিতে ফলাফল দেয় ।

.catch((error) => {
  assert.isNotOk(error,'Promise error');
  done();
});

উপরোক্ত errorকোডটিতে আপত্তিযুক্ত মূল্যায়ন করে trueযাতে দৃ the় গ্রন্থাগার একটি ত্রুটি নিক্ষেপ করে ... যা কখনও ধরা পড়ে না। ত্রুটির ফলে doneপদ্ধতিটি কখনই ডাকা হয় না। মোছার doneকলব্যাক এই ত্রুটিগুলি গ্রহণ করে, সুতরাং আপনি মোচায় সমস্ত প্রতিশ্রুতিবদ্ধ চেইনগুলি সহজেই শেষ করতে পারেন .then(done,done)। এটি নিশ্চিত করে যে সম্পন্ন পদ্ধতিটি সর্বদা ডাকা হয় এবং ত্রুটিটি একইভাবে জানানো হবে যখন মোচা সিঙ্ক্রোনাস কোডটিতে দৃ's়তার ত্রুটিটি ধরবে।

it('should transition with the correct event', (done) => {
  const cFSM = new CharacterFSM({}, emitter, transitions);
  let timeout = null;
  let resolved = false;
  new Promise((resolve, reject) => {
    emitter.once('action', resolve);
    emitter.emit('done', {});
    timeout = setTimeout(() => {
      if (!resolved) {
        reject('Timedout!');
      }
      clearTimeout(timeout);
    }, 100);
  }).then(((state) => {
    resolved = true;
    assert(state.action === 'DONE', 'should change state');
  })).then(done,done);
});

মোচায় প্রতিশ্রুতি পরীক্ষা করার সময় আমি। নিবন্ধটি ব্যবহার করার ধারণার জন্য কৃতিত্ব দিই then


6

যারা UnhandledPromiseRejectionWarningপরীক্ষার পরিবেশের বাইরে ত্রুটি / সতর্কতার সন্ধান করছেন তাদের পক্ষে , সম্ভবত কোডের কেউই প্রতিশ্রুতিতে শেষ ত্রুটির যত্ন নিচ্ছেন না কারণ এটি হতে পারে:

উদাহরণস্বরূপ, এই কোডটি এই প্রশ্নের মধ্যে উল্লিখিত সতর্কতাটি প্রদর্শন করবে:

new Promise((resolve, reject) => {
  return reject('Error reason!');
});

(node:XXXX) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Error reason!

এবং .catch()ত্রুটিটি যুক্ত করা বা পরিচালনা করা সতর্কতা / ত্রুটি সমাধান করা উচিত

new Promise((resolve, reject) => {
  return reject('Error reason!');
}).catch(() => { /* do whatever you want here */ });

অথবা thenফাংশনে দ্বিতীয় প্যারামিটার ব্যবহার করে

new Promise((resolve, reject) => {
  return reject('Error reason!');
}).then(null, () => { /* do whatever you want here */ });

1
অবশ্যই তবে আমি মনে করি বাস্তব জীবনে আমরা সাধারণত কেবল ব্যবহার করি না new Promise((resolve, reject) => { return reject('Error reason!'); })তবে function test() { return new Promise((resolve, reject) => { return reject('Error reason!'); });}.catch()test().catch(e => console.log(e))try { await test() } catch (e) { console.log(e) }
ফাংশনটিতে তাই অভ্যন্তরীণ ফাংশনটিতে আমাদের

1

আমি এই সমস্যার মুখোমুখি হয়েছি:

(নোড: 1131004) আনহানডেল্ডপ্রাইম রিজেকশনস সতর্কতা: আনহানডেলড প্রতিশ্রুতি প্রত্যাখ্যান (পুনরায় জেকশন আইডি: 1): প্রকারের ত্রুটি: রেস.জসন কোনও ফাংশন নয় (নোড: 1131004) অবমূল্যায়ন সতর্কতা: অব্যর্থহিত প্রতিশ্রুতি প্রত্যাখ্যানকে অবজ্ঞা করা হয়েছে। ভবিষ্যতে, প্রতিশ্রুতি প্রত্যাখ্যানগুলি যা পরিচালনা করা হয় না তা নোড.জেএস প্রক্রিয়াটি শূন্য-বহির্গমন প্রস্থান কোড দিয়ে শেষ করবে।

এটি আমার ভুল ছিল, আমি resবস্তুটি প্রতিস্থাপন করছিলাম then(function(res), তাই ফলাফলটিতে পরিবর্তিত resহয়ে এখন এটি কাজ করছে।

ভুল

module.exports.update = function(req, res){
        return Services.User.update(req.body)
                .then(function(res){//issue was here, res overwrite
                    return res.json(res);
                }, function(error){
                    return res.json({error:error.message});
                }).catch(function () {
                   console.log("Promise Rejected");
              });

সংশোধন

module.exports.update = function(req, res){
        return Services.User.update(req.body)
                .then(function(result){//res replaced with result
                    return res.json(result);
                }, function(error){
                    return res.json({error:error.message});
                }).catch(function () {
                   console.log("Promise Rejected");
              });

পরিষেবা কোড:

function update(data){
   var id = new require('mongodb').ObjectID(data._id);
        userData = {
                    name:data.name,
                    email:data.email,
                    phone: data.phone
                };
 return collection.findAndModify(
          {_id:id}, // query
          [['_id','asc']],  // sort order
          {$set: userData}, // replacement
          { "new": true }
          ).then(function(doc) {
                if(!doc)
                    throw new Error('Record not updated.');
                return doc.value;   
          });
    }

module.exports = {
        update:update
}

1

E7 async / প্রতীক্ষার সাথে আমার নেওয়া অভিজ্ঞতা এখানে :

যদি async helperFunction()আপনার পরীক্ষা থেকে আপনার কাছে ফোন আসে ... (ES7 asyncকীওয়ার্ডের সাথে একটির ব্যাখ্যা , মানে)

→ নিশ্চিত করুন, আপনি এটিকে কল করেছেন await helperFunction(whateverParams) (ভাল, হ্যাঁ, স্বাভাবিকভাবেই, একবার আপনি জানেন ...)

এবং এটি কাজ করার জন্য ('প্রতীক্ষা একটি সংরক্ষিত শব্দ' এড়ানোর জন্য), আপনার পরীক্ষা-ফাংশনে অবশ্যই একটি বহিরাগত async চিহ্নিতকারী থাকতে হবে:

it('my test', async () => { ...

4
আপনি না আছে যেমন কল await helperFunction(...)। একটি asyncফাংশন একটি প্রতিশ্রুতি ফেরত। আপনি কেবল প্রত্যাশিত প্রতিশ্রুতিটি পরিচালনা করতে পারেন যেমন আপনি কোনও ফাংশনটি করতে চান যাতে চিহ্নিত asyncহয় না যে প্রতিশ্রুতি ফিরে আসে return কথাটি হল প্রতিশ্রুতি, পিরিয়ড সামলানো। ফাংশনটি হোক asyncবা না হোক তাতে কিছু আসে যায় না। প্রতিশ্রুতি পরিচালনা করার একাধিক উপায়ের মধ্যে awaitকেবল একটি
লুই

1
সত্য। তবে তারপরে আমাকে ধরতে লাইন বিনিয়োগ করতে হবে ... বা আমার পরীক্ষাগুলি মিথ্যা ধনাত্মক হিসাবে উত্তীর্ণ হয় এবং যে কোনও ব্যর্থ প্রতিশ্রুতি অবিচ্ছিন্ন হয়ে যায় (পরীক্ষামূলক ফলাফলের ক্ষেত্রে)। সুতরাং অপেক্ষার চেয়ে কম লাইন এবং আমার কাছে প্রচেষ্টা লাগছে। - যাইহোক, অপেক্ষা করা ভুলে যাওয়া ছিল, UnhandledPromiseRejectionWarningআমার জন্য এটি কী কারণ ছিল ... এই উত্তরটি।
ফ্রাঙ্ক নোক্ক

0

সেলেনিয়ামের জন্য চাই-ওয়েবড্রাইভারের সাথে আমারও একইরকম অভিজ্ঞতা ছিল। আমি awaitদৃser়তার সাথে যুক্ত করেছি এবং এটি সমস্যার সমাধান করেছে:

শসাবার ব্যবহারের উদাহরণ:

Then(/I see heading with the text of Tasks/, async function() {
    await chai.expect('h1').dom.to.contain.text('Tasks');
});

-7

ওয়েবপ্যাক আনইনস্টল করার পরে আমি এই সমস্যাটি সমাধান করেছি (জেএস সমস্যাটি প্রতিক্রিয়া জানান)।

sudo uninstall webpack
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.