আমি কীভাবে পরীক্ষার জন্য এক্সপ্রেসজেএস-এর একটি উদাহরণ প্রোগ্রামগতভাবে বন্ধ করব?


111

আমি কীভাবে এক্সপ্রেসের উদাহরণ বন্ধ করব তা বোঝার চেষ্টা করছি। মূলত, আমি .listen(port)কলটির বিপরীতমুখীতা চাই - আমি কীভাবে একটি স্টপ শ্রবণ বন্ধ করতে, বন্দরটি ছেড়ে দিতে এবং পরিষ্কারভাবে শাটডাউন করার জন্য একটি এক্সপ্রেস সার্ভার পাব?

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

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

উত্তর:


163

জিনিসগুলি পরিবর্তিত হয়েছে কারণ এক্সপ্রেস সার্ভারটি নোড HTTP সার্ভার থেকে আর উত্তরাধিকার সূত্রে প্রাপ্ত নয়। ভাগ্যক্রমে, app.listen সার্ভারের উদাহরণটি দেয়।

var server = app.listen(3000);

// listen for an event
var handler = function() {
  server.close();
};

23
মোচা পরীক্ষার ক্ষেত্রে, যেখানে আপনার প্রয়োজন হবে ('অ্যাপ') আমি অ্যাপ্লিকেশনটির উপরে প্রসারিত করব: app.server = app.listen (3000); সুতরাং পরে আমি বলতে পারি: var অ্যাপ = প্রয়োজন ('./ অ্যাপ'); app.server.close ();
জ্যাক চি

4
সার্ভার পরীক্ষা করার সময়, github.com/visionmedia/supesttest দেখুন এটি আপনাকে ডাব্লু / ও প্রকৃত সার্ভার চালু করার পরীক্ষা করতে দেবে
লুকাশ লিসিস

আমি আপনাকে server.close()হুকের মধ্যে থেকে কল দিলে সম্পন্ন কলব্যাকটি পাস করার পরামর্শ দিচ্ছি ।
উল্লৌরি

4
দ্রষ্টব্য: 'অ্যাপ্লিকেশন' এর মধ্যে একটি বড় পার্থক্য রয়েছে যা এক্সপ্রেস অ্যাপ্লিকেশন উদাহরণ এবং 'অ্যাপ্লিকেশন'-এর রিটার্ন মান, এটি অন্তর্নিহিত দেশীয় এইচটিটিপি সার্ভার উদাহরণ যা' বন্ধ 'পদ্ধতি রয়েছে। @ জ্যাকচি এই উপরের দিকে ইঙ্গিত করেছেন।
আজ

খোলা রেখে দেওয়া ক্লায়েন্টের সকেটগুলির মধ্যে এটি সমস্যার কারণ নয়?
ক্যামেরন ট্যাকলিন্ড

20

ব্যবহার app.close()। পুরো উদাহরণ:

var app = require('express').createServer();
app.get('/', function(req, res){
  res.send('hello world');
});
app.get('/quit', function(req,res) {
  res.send('closing..');
  app.close();
});
app.listen(3000);

app.close()পরীক্ষা শেষ হয়ে গেলে কলব্যাকের অভ্যন্তরে কল করুন । তবে মনে রাখবেন যে প্রক্রিয়াটি এখনও চলছে (যদিও এটি আর শুনছে না)।

যদি এর পরে, আপনার প্রক্রিয়াটি শেষ করা দরকার, তারপরে কল করুন process.exit(0)

লিঙ্কগুলি:

app.close: http://nodejs.org/docs/latest/api/http.html#server.close (একই ক্ষেত্রে প্রয়োগ করা হবে)

প্রসেস.এক্সিট: http://nodejs.org/docs/latest/api/process.html#process.exit


4
নিখুঁত, ঠিক আমি যা খুঁজছিলাম। আমার ধারণা আমি এক্সপ্রেসে এটি পাইনি কারণ তারা মূল নোড HTTP সার্ভারটি প্রসারিত করেছিল যা আমি পুরোপুরি বুঝতে পারি নি। ধন্যবাদ!
drewww

ধন্যবাদ শ্রীজান, এটি আমাকেও সাহায্য করেছে
অ্যাডাম হপকিনসন

এটা কি এখনও সত্য? এক্সপ্রেস। ক্রিয়েট সার্ভারটি অবচিত হিসাবে চিহ্নিত রয়েছে এবং এটি একটি ত্রুটি দেয় যা অ্যাপ্লিকেশনটিকে আর http.js এর সার্ভার থেকে উত্তরাধিকার সূত্রে পাওয়া যায় না
ফ্রাঙ্ক শ্যুইটারম্যান

5
এক্সপ্রেস ৩. যেহেতু এটি বৈধ নয়
gprasant

4
এই জাতীয় সার্ভারটি বন্ধ করার জন্য ইউআরএল প্রকাশ করা ভাল ধারণা আইএমএইচও নয়।
শিপ

2

আমি "এইচটিটিপি সার্ভারটি কীভাবে শেষ করতে পারি" এর ভিন্নতার উত্তর বিভিন্নভাবে দিয়েছি সমর্থন চ্যানেল। দুর্ভাগ্যক্রমে, আমি বিদ্যমান লাইব্রেরিগুলির একটিরও সুপারিশ করতে পারিনি কারণ সেগুলির এক বা অন্য উপায়ে অভাব রয়েছে। আমি তখন থেকে একটি প্যাকেজ একসাথে রেখেছি যা (আমি বিশ্বাস করি) ক্রেফুল এইচটিটিপি সার্ভারের সমাপ্তি প্রত্যাশিত সমস্ত মামলা পরিচালনা করছে।

https://github.com/gajus/http-terminator

এইচটিপি-টার্মিনেটরের প্রধান সুবিধা হ'ল:

  • এটি নোড.জেএসআইপি বানর-প্যাচ দেয় না
  • এটি সংযুক্ত HTTP অনুরোধ ব্যতীত সমস্ত সকেট তত্ক্ষণাত ধ্বংস করে
  • এটি চলমান এইচটিটিপি অনুরোধের সাথে সকেটগুলিকে চমত্কার সময়সীমা অনুমোদন করে
  • এটি HTTPS সংযোগগুলি সঠিকভাবে পরিচালনা করে
  • এটি সংযুক্ত রাখুন ব্যবহার করে সংযোগকে অবহিত করে যে সংযোগটি সেট করে সার্ভারটি বন্ধ হচ্ছে: বন্ধ শিরোনাম
  • এটি নোড.জেএস প্রক্রিয়াটি শেষ করে না

এক্সপ্রেস.জেএস এর সাথে ব্যবহার:

import express from 'express';
import {
  createHttpTerminator,
} from 'http-terminator';

const app = express();

const server = app.listen();

const httpTerminator = createHttpTerminator({
  server,
});

await httpTerminator.terminate();



-1

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

আমি আমার সম্পূর্ণ ক্রমাগত স্থাপন প্রক্রিয়া জন্য এই জাতীয় স্ক্রিপ্ট ব্যবহার করি। এ সম্পর্কে কিছু অন্তর্দৃষ্টি করার জন্য আপনার জোন রোহানের ডেড সিম্পল গিট ওয়ার্কফ্লোতে নজর দেওয়া উচিত ।


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

পরিবেশ-নির্দিষ্ট পরীক্ষা কেন লিখছেন? হয়তো আমি ভুল, কিন্তু এটি আমাকে খারাপ অভ্যাস হিসাবে আঘাত করে। আমি আপনার পরীক্ষার সাথে পরিবেশের অজ্ঞেয় থাকার চেষ্টা করবো, কারণ আপনি চাইবেন যে আপনার পরীক্ষাগুলি তাদের দলের উন্নয়নের পরিবেশ নির্বিশেষে আপনার দল জুড়ে কাজ করবে।
জোশ স্মিথ

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

আপনি নিজের পরীক্ষার কোডটিকে ব্যাশে নিজেই রাখবেন না। আপনি কেবল সার্ভারটি শুরু করে স্ক্রিপ্ট থেকে পরীক্ষাগুলি চালাতে চাইবেন, ঠিক যেমন আপনি কমান্ড লাইনে নিজেকে করবেন। এখানে কোন আসল বিশেষ জাদু নেই।
জোশ স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.