এক্সপ্রেস এবং হাপি কীভাবে একে অপরের সাথে তুলনা করে?


133

ওয়েব অ্যাপ্লিকেশন ডিজাইন এবং বিকাশের দিক থেকে, এক্সপ্রেস এবং হাপি কীভাবে একে অপরের সাথে তুলনা করে? প্রাথমিক উদাহরণগুলির জন্য এগুলি একই রকম মনে হয় তবে আমি সামগ্রিক প্রয়োগের কাঠামোর মূল পার্থক্য সম্পর্কে আরও জানতে আগ্রহী।

উদাহরণস্বরূপ, আমি যতদূর জানতে পেরেছি, হাপি একটি ভিন্ন রাউটিং মেকানিজম ব্যবহার করে যা নিবন্ধকরণের আদেশটিকে বিবেচনায় নেয় না, দ্রুত অনুসন্ধান করতে পারে, তবে এক্সপ্রেসের সাথে তুলনা করার ক্ষেত্রে সীমাবদ্ধ। অন্যান্য গুরুত্বপূর্ণ পার্থক্য আছে?

এছাড়া একটি হল নিবন্ধটি নতুন npmjs.com ওয়েবসাইট উন্নয়নশীল জন্য Hapi (এক্সপ্রেস বেশি) চয়ন করা সম্পর্কে এই নিবন্ধটি রাজ্যের যে "Hapi এর প্লাগ-ইন সিস্টেম মানে হল, আমরা উপায়ে যে microservices জন্য সম্ভব হবে বিভিন্ন মতকে এবং আবেদন পরিষেবা বিছিন্ন করতে ভবিষ্যত। অন্যদিকে এক্সপ্রেসের একই কার্যকারিতাটি পেতে কিছুটা আরও কনফিগারেশন প্রয়োজন ", এর সঠিক অর্থ কী?

উত্তর:


231

এটি একটি বড় প্রশ্ন এবং সম্পূর্ণ হওয়ার জন্য একটি দীর্ঘ উত্তর প্রয়োজন, সুতরাং আমি কেবল সবচেয়ে গুরুত্বপূর্ণ পার্থক্যের একটি উপসেটটি সম্বোধন করব। দুঃখিত যে এটি এখনও একটি দীর্ঘ উত্তর।

তারা কেমন হয়?

আপনি একেবারে ঠিক বলেছেন যখন আপনি বলেছেন:

প্রাথমিক উদাহরণগুলির জন্য এগুলি একই রকম মনে হয়

উভয় ফ্রেমওয়ার্ক একই বেসিক সমস্যাটি সমাধান করছে: নোডে HTTP সার্ভার তৈরির জন্য একটি সুবিধাজনক এপিআই সরবরাহ। এটি বলতে গেলে httpএকা নিম্ন স্তরের নেটিভ মডিউল ব্যবহারের চেয়ে বেশি সুবিধাজনক । httpমডিউল সবকিছু আমরা চান করতে পারেন কিন্তু এটা দিয়ে অ্যাপ্লিকেশন লিখতে ক্লান্তিকর না।

এটি অর্জনের জন্য, তারা উভয়ই এমন ধারণাগুলি ব্যবহার করে যা দীর্ঘ সময় ধরে উচ্চ স্তরের ওয়েব ফ্রেমওয়ার্কগুলিতে রয়েছে: রাউটিং, হ্যান্ডলারগুলি, প্লাগইনগুলি, প্রমাণীকরণের মডিউলগুলি। তাদের সর্বদা একই নাম নাও থাকতে পারে তবে তারা মোটামুটি সমান।

বেশিরভাগ বুনিয়াদি উদাহরণগুলি দেখতে এরকম কিছু দেখায়:

  • একটি রুট তৈরি করুন
  • প্রতিক্রিয়াটি প্রস্তুত করে যখন রুটটি অনুরোধ করা হবে তখন একটি ফাংশন চালান
  • অনুরোধ সাড়া

প্রকাশ করা:

app.get('/', function (req, res) {

    getSomeValue(function (obj) {

        res.json({an: 'object'});
    });
});

hapi:

server.route({
    method: 'GET',
    path: '/',
    handler: function (request, reply) {

        getSomeValue(function (obj) {

            reply(obj);
        });
    }
});

পার্থক্য ঠিক এখানে স্থলভাগ না? তাহলে কেন একে অপরকে বেছে নেবেন?

কিভাবে তারা ব্যতিক্রম?

সহজ উত্তরটি হাপি অনেক বেশি এবং এটি বাক্সের বাইরেও অনেক কিছু করে। আপনি যখন উপরের থেকে সহজ উদাহরণটি দেখেন তখন এটি স্পষ্ট নাও হতে পারে। আসলে এটি ইচ্ছাকৃত is সাধারণ কেসগুলি সহজ রাখা হয়। সুতরাং আসুন কিছু বড় পার্থক্য পরীক্ষা করা যাক:

দর্শন

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

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

server.route({
    config: {
        payload: {
            output: 'data',
            parse: true
        }
    },
    method: 'GET',
    path: '/',
    handler: function (request, reply) {

        reply(request.payload);
    }
});

বৈশিষ্ট্য

আপনাকে কেবল দুটি প্রকল্পের এপিআই ডকুমেন্টেশন তুলনা করতে হবে তা দেখতে হ্যাপি আরও একটি বড় বৈশিষ্ট্য সেট সরবরাহ করে।

হাপিতে অন্তর্নির্মিত নিম্নলিখিত কয়েকটি বৈশিষ্ট্য অন্তর্ভুক্ত রয়েছে যা এক্সপ্রেস দেয় না (যতদূর আমি জানি):

এক্সটেনসিবিলিটি এবং মডুলারিটি

হাপি এবং এক্সপ্রেস এক্সটেনসিবিলিটি সম্পর্কে বেশ অন্যভাবে যায়। এক্সপ্রেসের সাথে, আপনার মিডলওয়্যার ফাংশন রয়েছে। মিডলওয়্যার ফাংশনগুলি হ'ল ফিল্টারগুলির মতো যা আপনি স্ট্যাক আপ করেন এবং আপনার হ্যান্ডলারটি আঘাতের আগে সমস্ত অনুরোধগুলি সেগুলির মধ্য দিয়ে চলে।

hapi এর কাছে অনুরোধটি জীবনচক্র রয়েছে এবং এটি এক্সটেনশন পয়েন্টগুলি সরবরাহ করে , যা মিডলওয়্যার ফাংশনের সাথে তুলনীয় তবে অনুরোধের লাইফসাইলে বিভিন্ন সংজ্ঞাযুক্ত পয়েন্ট রয়েছে।

ওয়ালমার্ট হাপি তৈরি এবং এক্সপ্রেস ব্যবহার বন্ধ করে দেওয়ার একটি কারণ হ'ল একটি এক্সপ্রেস অ্যাপ্লিকেশনটিকে পৃথক অংশে বিভক্ত করা কতটা কঠিন ছিল তা নিয়ে হতাশা ছিল এবং বিভিন্ন দলের সদস্যরা তাদের খণ্ডে নিরাপদে কাজ করতে পারে। এই কারণে তারা হাপিটিতে প্লাগইন সিস্টেম তৈরি করেছে ।

একটি প্লাগইন একটি সাব-অ্যাপ্লিকেশনটির মতো, আপনি হপি অ্যাপ্লিকেশনটিতে যা কিছু করতে পারেন, রুটগুলি, এক্সটেনশন পয়েন্টগুলি যোগ করতে পারেন ইত্যাদি একটি প্লাগইনে আপনি নিশ্চিত হতে পারেন যে আপনি অ্যাপ্লিকেশনটির অন্য অংশটি ভাঙ্গছেন না, কারণ ক্রম রুটের নিবন্ধকরণগুলি গুরুত্বপূর্ণ নয় এবং আপনি বিরোধী রুট তৈরি করতে পারবেন না। তারপরে আপনি এই প্লাগইনগুলিকে একটি সার্ভারে একত্রিত করতে এবং এটি স্থাপন করতে পারেন।

ইকোসিস্টেম

এক্সপ্রেস আপনাকে বাক্সের বাইরে খুব সামান্য দেয় তাই আপনার প্রকল্পে যখন আপনাকে কিছু যুক্ত করার দরকার হয় তখন আপনাকে বাইরে তাকাতে হবে। হাপির সাথে কাজ করার সময় অনেক সময় আপনার যে বৈশিষ্ট্যটি প্রয়োজন তা হয় অন্তর্নির্মিত বা মূল দলটি তৈরি করেছেন একটি মডিউল।

নূন্যতম দুর্দান্ত লাগছে। তবে আপনি যদি কোনও গুরুতর প্রযোজনীয় অ্যাপ্লিকেশন তৈরি করে থাকেন তবে শেষ পর্যন্ত আপনার এই সমস্ত সামগ্রীর প্রয়োজন হওয়ার সম্ভাবনা রয়েছে।

নিরাপত্তা

ওয়ালমার্টে ব্ল্যাক ফ্রাইডে ট্র্যাফিক চালানোর জন্য দলটি হ্যাপি তৈরি করেছিল যাতে সুরক্ষা এবং স্থিতিশীলতা সর্বদা শীর্ষস্থানের বিষয় been এই কারণে ফ্রেমওয়ার্কটি আপনার প্রক্রিয়াটির স্মৃতিশক্তি ক্লান্ত করতে না দেওয়ার জন্য আগত পেডলোডের আকার সীমাবদ্ধ করার মতো অতিরিক্ত অনেক কিছু করে। এতে সর্বাধিক ইভেন্টের লুপ বিলম্ব, সর্বাধিক আরএসএস মেমরি ব্যবহৃত এবং ভি 8 হিপের সর্বাধিক আকারের মতো বিষয়গুলির জন্য বিকল্প রয়েছে যা আপনার সার্ভারটি কেবল ক্র্যাশ না করে 503 টাইমআউট দিয়ে সাড়া দেবে।

সারসংক্ষেপ

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


অস্বীকৃতি: হাপি সম্পর্কিত একটি বইয়ের লেখক হিসাবে আমি পক্ষপাতদুষ্ট এবং উপরোক্ত মূলত আমার ব্যক্তিগত মতামত।


7
ম্যাট, বিস্তৃত পোস্টের জন্য আপনাকে ধন্যবাদ, "এক্সটেনসিবিলিটি এবং মডিউলারিটি" এবং "সুরক্ষা" বিভাগগুলি আমার জন্য সবচেয়ে সহায়ক বিভাগ ছিল sections আমি অনুমান করি যে এটি উল্লেখযোগ্য যে এক্সপ্রেস 4 এ নতুন রাউটিং সিস্টেমটি সাব-অ্যাপ্লিকেশনগুলির জন্য উন্নত মডুলারিটি সরবরাহ করে।
আলী শাকিবা

1
দুর্দান্ত উত্তর আমরা বি / ডাব্লু ডাব্লু হাপি এবং এক্সপ্রেসকেও বিভ্রান্ত করছি, আমরা হাপির সাথে যে ত্রুটি দেখতে পাচ্ছি তা হ'ল এটির সম্প্রদায়ের সমর্থন এক্সপ্রেসের মতো বিস্তৃত নয় এবং আমরা কোথাও আটকে গেলে একটি বড় সমস্যা হতে পারে। একই বিষয়ে আপনার মতামত প্রয়োজন।
আমান গুপ্ত

1
এক্সপ্রেস জেনেরিক, অন্যদিকে হাপি আরও কিছু উদ্যোগ prise
উইন্ডমায়াও

1
@ ম্যাটহারিসন দুর্দান্ত উত্তর, এই মুহুর্তে আমি হাপির উপর আপনার বইটি পড়ছি, এটি দুর্দান্ত। আমি হ্যাপি ব্যাকএন্ডে এবং ভ্যু জেজে ফ্রন্টএন্ডে বইয়ের জন্য একটি নতুন মার্কেটপ্লেস বিকাশ করতে চলেছি, হাপির অভ্যস্ত হয়ে যাওয়ার পরে আমি হাপি প্রকল্পে সক্রিয়ভাবে অংশ নিতে চাই।
হুমায়ুন আহমদ

1
@ হুমায়ুন গ্রেট! <= V16.0.0 থেকে কিছু উল্লেখযোগ্য পরিবর্তন সহ হাপির একটি নতুন প্রধান সংস্করণ রয়েছে তবে সচেতন হন। আমি বর্তমানে লোকেরা v17 শেখার জন্য ডিজাইন করা একটি স্ক্রিনকাস্ট সিরিজ তৈরি করছি: youtube.com/playlist?list=PLi303AVTbxaxqjaSWPg94nccYIfqNoCHz
ম্যাট হ্যারিসন

54

আমার সংগঠনটি হাপির সাথে চলছে। এ কারণেই আমরা এটি পছন্দ করি।

হাপি হ'ল:

  • প্রধান কর্পস দ্বারা সমর্থিত। এর অর্থ এই সম্প্রদায়ের সমর্থন শক্তিশালী হবে এবং ভবিষ্যতের প্রকাশনা জুড়ে এটি আপনার জন্য। উত্সাহী হাপি লোকদের খুঁজে পাওয়া সহজ, এবং সেখানে ভাল টিউটোরিয়াল রয়েছে (যদিও এটি এক্সপ্রেসজেস ​​টিউটোরিয়ালগুলির মতো অসংখ্য এবং বিস্তৃত নয়)। এই পোস্টের তারিখ হিসাবে এনপিএম এবং ওয়ালমার্ট হাপি ব্যবহার করে।
  • এটিপিআই পৃষ্ঠের বাকী অংশ সম্পর্কে বিস্তৃত জ্ঞান না রেখে ব্যাকএন্ড পরিষেবাদির বিভিন্ন অংশে বিতরণকারী দলের কাজ সহজতর করতে পারে (হাপির প্লাগইন আর্কিটেকচারটি এই মানেরটির প্রতিচ্ছবি)।
  • ফ্রেমওয়ার্কটি ফ্রেমওয়ার্কটিকে যা করা উচিত তা করতে দিন: জিনিসগুলি কনফিগার করুন। এর পরে কাঠামোটি অদৃশ্য হওয়া উচিত এবং ডিভগুলিকে ব্যবসায়ের যুক্তি তৈরির ক্ষেত্রে তাদের প্রকৃত সৃজনশীল শক্তি ফোকাস করার অনুমতি দেওয়া উচিত। এক বছর ধরে হাপিকে ব্যবহার করার পরে, আমি অবশ্যই মনে করি হাপি এটি সম্পাদন করে। আমি সুখী অনুভব করছি!

আপনি যদি সরাসরি ইরান হাতুড়ি থেকে শুনতে চান (হাফির নেতৃত্ব)

বিগত চার বছরে হাপি বড় বা ছোট অনেক প্রকল্পের পছন্দের কাঠামো হয়ে উঠেছে। যা হাপিকে অনন্য করে তোলে তা হল বড় মোতায়েনকারী এবং বড় বড় দলগুলিতে স্কেল করার ক্ষমতা। যেমন একটি প্রকল্প বৃদ্ধি পায়, তেমনি এর জটিলতাও ঘটে - প্রকৌশল জটিলতা এবং প্রক্রিয়াজাতীয় জটিলতা। হাপির স্থাপত্য ও দর্শন ক্রমাগত কোডটি রিফ্যাক্টরের প্রয়োজন ছাড়াই বর্ধিত জটিলতা পরিচালনা করে [আরও পড়ুন]

হাপি দিয়ে শুরু করা এক্সপ্রেসজেসের মতো সহজ হবে না কারণ হাপির একই "তারকা শক্তি" নেই ... তবে আপনি যদি স্বাচ্ছন্দ্য বোধ করেন তবে আপনি প্রচুর মাইলেজ পাবেন। আমাকে নতুন হ্যাকার হিসাবে প্রায় 2 মাস ডলার নিয়েছিলেন যিনি দায়িত্বহীনভাবে কয়েক বছরের জন্য এক্সপ্রেসজেস ​​ব্যবহার করেছেন। যদি আপনি একটি পাকা ব্যাকএন্ড বিকাশকারী হন তবে আপনি ডক্স কীভাবে পড়বেন তা আপনি জানেন এবং আপনি সম্ভবত এটি লক্ষ্য করবেন না।

হাপি ডকুমেন্টেশনগুলির ক্ষেত্রগুলি এতে উন্নতি করতে পারে:

  1. ব্যবহারকারীদের কীভাবে প্রমাণীকরণ করবেন এবং সেশন তৈরি করবেন
  2. ক্রস-অরিজিন-অনুরোধগুলি (সিওআরএস) পরিচালনা করা
  3. ফাইলগুলি আপলোড করা হচ্ছে (বহুগুণ, কাটা)

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

বাকি দুটি আসলে এতটা কঠিন নয়, ডক্সটি কেবল আরও ভালভাবে লেখা যেতে পারে।


3

হাপি বা হাপি জেএস সম্পর্কে দ্রুত তথ্য?

হাফি কনফিগারেশন-কেন্দ্রিক এটি কাঠামোর মধ্যে প্রমাণীকরণ এবং অনুমোদন তৈরি করেছে এটি যুদ্ধ-পরীক্ষিত বায়ুমন্ডলে প্রকাশিত হয়েছিল এবং সত্যই এর মূল্য প্রমাণ করেছে সমস্ত মডিউলটিতে 100% পরীক্ষার কভারেজ রয়েছে এটি মূল এইচটিটিপি থেকে দূরে বিমূর্ততার সর্বোচ্চ স্তরের নিবন্ধন করে সহজেই কম্পাসেবল প্লাগইন আর্কিটেকচারের মাধ্যমে

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

ব্যবহার

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

এন্টারপ্রাইজ অ্যাপ্লিকেশন তৈরি করার সময় বিকাশকারীরা এক্সপ্রেস নির্বাচন না করার কয়েকটি কারণ হ'ল:

রুটগুলি এক্সপ্রেসে রচনা করা আরও শক্ত

মিডলওয়্যার বেশিরভাগ সময় পথে যায়; প্রতিবার আপনি রুটগুলি নির্ধারণ করছেন, আপনাকে অনেকগুলি কোড লিখতে হবে।

হ্যাপি হ'ল একজন ডেভেলপারের জন্য আরএসএসএফুল এপিআই তৈরির সর্বাধিক পছন্দ। হাপির মাইক্রো-সার্ভিস আর্কিটেকচার রয়েছে এবং নির্দিষ্ট পরামিতিগুলির উপর ভিত্তি করে নিয়ন্ত্রণটি হ্যান্ডলার থেকে অন্য হ্যান্ডলারে স্থানান্তর করাও সম্ভব। Hapi প্লাগইনটি দিয়ে আপনি HTTP- র চারপাশে বিস্তৃত বিস্তৃতি উপভোগ করতে পারবেন কারণ আপনি ব্যবসায়ের যুক্তি সহজেই পরিচালনাযোগ্য টুকরো টুকরো টুকরো করে ফেলতে পারেন।

হাপির সাথে আরও একটি বিশাল সুবিধা হ'ল আপনি ভুল কনফিগার করার সময় এটি বিশদ ত্রুটির বার্তা সরবরাহ করে। Hapi আপনাকে ডিফল্টরূপে আপনার ফাইল আপলোডের আকারটি কনফিগার করতে দেয়। সর্বাধিক আপলোডের আকারটি যদি সীমাবদ্ধ থাকে তবে আপনি ফাইলের আকারটি অনেক বড় বলে পৌঁছে দিতে ব্যবহারকারীকে একটি ত্রুটি বার্তা প্রেরণ করতে পারেন। এটি আপনার সার্ভারটিকে ক্রাশ থেকে রক্ষা করবে কারণ ফাইল আপলোডগুলি আর একটি সম্পূর্ণ ফাইল বাফার করার চেষ্টা করবে না।

  1. এক্সপ্রেস ব্যবহার করে আপনি যা অর্জন করতে পারেন তা সহজেই hapi.js ব্যবহার করে অর্জন করা যায়।

  2. Hapi.js খুব আড়ম্বরপূর্ণ এবং কোডটি খুব ভালভাবে সাজায়। আপনি যদি দেখেন যে এটি কীভাবে রাউটিং করে এবং মূল যুক্তিগুলিকে নিয়ন্ত্রণকারীগুলিতে রাখে তবে আপনি অবশ্যই তা পছন্দ করবেন।

  3. হাপি.জেএসস আনুষ্ঠানিকভাবে hapi.js এর জন্য টোকন ভিত্তিক লেখক থেকে শুরু করে সেশন ম্যানেজমেন্ট এবং আরও অনেক কিছুতে একাধিক প্লাগইন সরবরাহ করে যা এটি একটি বিজ্ঞাপন। এর অর্থ এই নয় যে nতিহ্যবাহী এনপিএম ব্যবহার করা যাবে না, তাদের সকলকেই হপিআইজেএস সমর্থন করে

  4. আপনি যদি hapi.js কোড করেন তবে একটি কোড খুব রক্ষণাবেক্ষণযোগ্য হবে।


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

1

আমি সম্প্রতি হাপি ব্যবহার শুরু করেছি এবং এতে আমি বেশ খুশি। আমার কারণগুলি হল

  1. পরীক্ষা করা সহজ। উদাহরণ স্বরূপ:

    • server.inject আপনাকে অ্যাপটি চালানোর অনুমতি দেয় এবং এটি না চালিয়ে এবং না শুনে প্রতিক্রিয়া পেতে পারে।
    • server.info বর্তমান ইউরি, বন্দর ইত্যাদি দেয়
    • server.settingsকনফিগারেশন অ্যাক্সেস করে যেমন server.settings.cacheবর্তমান ক্যাশে সরবরাহকারী পান
    • সন্দেহজনকভাবে /testঅ্যাপ্লিকেশনটির কোনও অংশের জন্য ফোল্ডারগুলি বা সমর্থিত প্লাগইনগুলিকে কীভাবে উপহাস / পরীক্ষা / স্টাব ইত্যাদি সম্পর্কে পরামর্শ দেখতে দেখুন look
    • আমার অনুভূতি হ্যাপির স্থাপত্য মডেল আপনাকে বিশ্বাস করতে পারে তবে যাচাই করতে দেয় যেমন আমার প্লাগইনগুলি নিবন্ধিত আছে ? আমি কীভাবে একটি মডিউল নির্ভরতা ঘোষণা করতে পারি ?
  2. এটি বাক্সের বাইরে কাজ করে যেমন ফাইল আপলোড , শেষ পয়েন্টগুলি থেকে ফেরত স্ট্রিম ইত্যাদি

  3. মূল গ্রন্থাগারের পাশাপাশি প্রয়োজনীয় প্লাগইনগুলি বজায় রাখা হয়। যেমন টেমপ্লেট পার্সিং , ক্যাশিং ইত্যাদি যোগ করা সুবিধাটি হ'ল একই কোডিং মানগুলি প্রয়োজনীয় জিনিসগুলি জুড়ে প্রয়োগ করা হয়।

  4. বুদ্ধিমান ত্রুটি এবং ত্রুটি পরিচালনা Hapi কনফিগার বিকল্পগুলি বৈধতা দেয় এবং সদৃশ রুটগুলি প্রতিরোধ করার জন্য একটি অভ্যন্তরীণ রুট টেবিল রাখে। এটি শেখার সময় বেশ কার্যকর কারণ ত্রুটিগুলি অপ্রত্যাশিত আচরণগুলির পরিবর্তে নিক্ষেপ করা হয় যার জন্য ডিবাগিং প্রয়োজন।


-1

যোগ করার মতো আরও একটি বিষয়, হপি 16 সংস্করণ থেকে 'HT2' কলগুলি সমর্থন করা শুরু করেছে (যদি আমি ভুল না হয়)। যাইহোক, এক্সপ্রেস এখনও 4 'এক্সপ্রেস 2' মডিউলটিকে সরাসরি প্রকাশের 4 পর্যন্ত সমর্থন করতে পারে না যদিও তারা এক্সপ্রেস 5 এর আলফা সংস্করণে বৈশিষ্ট্যটি প্রকাশ করেছে।


-2
'use strict';
const Hapi = require('hapi');
const Basic = require('hapi-auth-basic');
const server = new Hapi.Server();
server.connection({
    port: 2090,
    host: 'localhost'
});


var vorpal = require('vorpal')();
const chalk = vorpal.chalk;
var fs = require("fs");

var utenti = [{
        name: 'a',
        pass: 'b'
    },
    {
        name: 'c',
        pass: 'd'
    }
];

const users = {
    john: {
        username: 'john',
        password: 'secret',
        name: 'John Doe',
        id: '2133d32a'
    },
    paul: {
        username: 'paul',
        password: 'password',
        name: 'Paul Newman',
        id: '2133d32b'
    }
};

var messaggi = [{
        destinazione: 'a',
        sorgente: 'c',
        messsaggio: 'ciao'
    },
    {
        destinazione: 'a',
        sorgente: 'c',
        messsaggio: 'addio'
    },
    {
        destinazione: 'c',
        sorgente: 'a',
        messsaggio: 'arrivederci'
    }
];

var login = '';
var loggato = false;

vorpal
    .command('login <name> <pass>')
    .description('Effettua il login al sistema')
    .action(function (args, callback) {
        loggato = false;
        utenti.forEach(element => {
            if ((element.name == args.name) && (element.pass == args.pass)) {
                loggato = true;
                login = args.name;
                console.log("Accesso effettuato");
            }
        });
        if (!loggato)
            console.log("Login e Password errati");
        callback();
    });

vorpal
    .command('leggi')
    .description('Leggi i messaggi ricevuti')
    .action(function (args, callback) {
        if (loggato) {
            var estratti = messaggi.filter(function (element) {
                return element.destinazione == login;
            });

            estratti.forEach(element => {
                console.log("mittente : " + element.sorgente);
                console.log(chalk.red(element.messsaggio));
            });
        } else {
            console.log("Devi prima loggarti");
        }
        callback();
    });

vorpal
    .command('invia <dest> "<messaggio>"')
    .description('Invia un messaggio ad un altro utente')
    .action(function (args, callback) {
        if (loggato) {
            var trovato = utenti.find(function (element) {
                return element.name == args.dest;
            });
            if (trovato != undefined) {
                messaggi.push({
                    destinazione: args.dest,
                    sorgente: login,
                    messsaggio: args.messaggio
                });
                console.log(messaggi);
            }
        } else {
            console.log("Devi prima loggarti");
        }
        callback();
    });

vorpal
    .command('crea <login> <pass>')
    .description('Crea un nuovo utente')
    .action(function (args, callback) {
        var trovato = utenti.find(function (element) {
            return element.name == args.login;
        });
        if (trovato == undefined) {
            utenti.push({
                name: args.login,
                pass: args.pass
            });
            console.log(utenti);
        }
        callback();
    });

vorpal
    .command('file leggi utenti')
    .description('Legge il file utenti')
    .action(function (args, callback) {
        var contents = fs.readFileSync("utenti.json");
        utenti = JSON.parse(contents);
        callback();
    });

vorpal
    .command('file scrivi utenti')
    .description('Scrive il file utenti')
    .action(function (args, callback) {
        var jsontostring = JSON.stringify(utenti);
        fs.writeFile('utenti.json', jsontostring, function (err) {
            if (err) {
                return console.error(err);
            }
        });
        callback();
    });

vorpal
    .command('file leggi messaggi')
    .description('Legge il file messaggi')
    .action(function (args, callback) {
        var contents = fs.readFileSync("messaggi.json");
        messaggi = JSON.parse(contents);
        callback();
    });

vorpal
    .command('file scrivi messaggi')
    .description('Scrive il file messaggi')
    .action(function (args, callback) {
        var jsontostring = JSON.stringify(messaggi);
        fs.writeFile('messaggi.json', jsontostring, function (err) {
            if (err) {
                return console.error(err);
            }
        });
        callback();
    });

// leggi file , scrivi file

vorpal
    .delimiter(chalk.yellow('messaggi$'))
    .show();




const validate = function (request, username, password, callback) {
    loggato = false;


    utenti.forEach(element => {
        if ((element.name == username) && (element.pass == password)) {
            loggato = true;
            console.log("Accesso effettuato");
            return callback(null, true, {
                name: username
            })
        }
    });
    if (!loggato)
        return callback(null, false);
};

server.register(Basic, function (err) {
    if (err) {
        throw err;
    }
});

server.auth.strategy('simple', 'basic', {
    validateFunc: validate
});



server.route({
    method: 'GET',
    path: '/',
    config: {
        auth: 'simple',
        handler: function (request, reply) {
            reply('hello, ' + request.auth.credentials.name);
        }
    }
});

//route scrivere
server.route({
    method: 'POST',
    path: '/invia',
    config: {
        auth: 'simple',
        handler: function (request, reply) {
            //console.log("Received POST from " + request.payload.name + "; id=" + (request.payload.id || 'anon'));
            var payload = encodeURIComponent(request.payload)
            console.log(request.payload);
            console.log(request.payload.dest);
            console.log(request.payload.messaggio);
            messaggi.push({
                destinazione: request.payload.dest,
                sorgente: request.auth.credentials.name,
                messsaggio: request.payload.messaggio
            });
            var jsontostring = JSON.stringify(messaggi);
            fs.writeFile('messaggi.json', jsontostring, function (err) {
                if (err) {
                    return console.error(err);
                }
            });
            console.log(messaggi);
            reply(messaggi[messaggi.length - 1]);

        }
    }
});


//route leggere (json)
server.route({
    method: 'GET',
    path: '/messaggi',
    config: {
        auth: 'simple',
        handler: function (request, reply) {
            messaggi = fs.readFileSync("messaggi.json");
            var estratti = messaggi.filter(function (element) {
                return element.destinazione == request.auth.credentials.name;
            });
            var s = [];

            console.log(request.auth.credentials.name);
            console.log(estratti.length);
            estratti.forEach(element => {

                s.push(element);

                //fare l'array con stringify
                //s+="mittente : "+element.sorgente+": "+element.messsaggio+"\n";

            });
            var a = JSON.stringify(s);
            console.log(a);
            console.log(s);
            reply(a);
        }
    }
});



server.start(function () {
    console.log('Hapi is listening to ' + server.info.uri);
});

function EseguiSql(connection, sql, reply) {
    var rows = [];
    request = new Request(sql, function (err, rowCount) {
        if (err) {
            console.log(err);
        } else {
            console.log(rowCount + ' rows');
            console.log("Invio Reply")
            reply(rows);
        }
    });

    request.on('row', function (columns) {
        var row = {};
        columns.forEach(function (column) {
            row[column.metadata.colName] = column.value;
        });
        rows.push(row);
    });

    connection.execSql(request);
}

server.route({
    method: 'POST',
    path: '/query',
    handler: function (request, reply) {
        // Qui dovrebbe cercare i dati nel body e rispondere con la query eseguita
        var connection = new Connection(config);

        // Attempt to connect and execute queries if connection goes through
        connection.on('connect', function (err) {
            if (err) {
                console.log(err);
            } else {

                console.log('Connected');
                console.log(request.payload.sql);
                EseguiSql(connection, request.payload.sql, reply);
            }
        });

    }
});

server.connection({
    host: process.env.HOST || 'localhost',
    port: process.env.PORT || 8080
});

var config = {
    userName: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    server: process.env.DB_SERVER,
    options: {
        database: process.env.DB_NAME,
        encrypt: true
    }
}

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