نشر واجهة برمجة تطبيقات GraphQL/منغودب باستخدام وظائف Netlify
بافيل ريبشينسكي
Software Engineer
الأهداف الإعداد الأولي الإعداد الأولي تثبيت التبعيات لنبدأ أولاً، أضف tsconfig.json إلى الدليل الرئيسي: الآن، لننشئ src/server.ts لتطبيقات الخوادم. ثم أضف دالتين: واحدة للخادم المحلي والثانية للامبدا. حسنًا، ليس لدينا أي محاليل أو تعريفات للنوع لذا نحتاج إلى إنشاء بعضها. لنفترض أننا في البداية نريد [...].
الأهداف
تكوين كل من الخوادم المحلية وخوادم لامدا.
قم بتوصيل كليهما بـ MongoDB.
تنفيذ المصادقة الأساسية.
نشر أبولو بدون خادم GraphQL واجهة برمجة التطبيقات (API) مع Netlify.
// src/server.ts
استيراد { ApolloServer باسم ApolloServerLambda } من "Apollo-server-lambda";
استيراد { ApolloServer } من "Apollo-server-server";
استيراد { typeDefs } من "./schemas";
استيراد { المحللات } من "./ المحللات";
{...}
التواصل مع MongoDB عبر mongoDB عبر mongoose
الآن هو الوقت المناسب لإنشاء اتصال بقاعدة بياناتنا. في هذه الحالة بالذات، ستكون MongoDB. إنه مجاني وسهل الصيانة. ولكن قبل ذلك، لنقم بتثبيت تبعيتين أخريين:
الأمان أولاً! لنقم الآن بتأمين كلمات المرور الخاصة بنا عن طريق تجزئتها.
npm install - حفظ bcrypt @types/bcrypt
الآن، قم بتنفيذ أمان كلمة المرور داخل رد استدعاء البرنامج الوسيط المسبق. يتم تنفيذ دالات ما قبل البرامج الوسيطة واحدة تلو الأخرى، عند استدعاء كل برنامج وسيط بعد ذلك. لجعل كلمات المرور آمنة، نحن نستخدم تقنية تُنشئ ملحًا وتجزئة في استدعاءات دالة منفصلة.
// src/model.ts
استيراد bcrypt من "bcrypt";
{...}
const SALT_WORK_FACTOR: الرقم = 10;
UserSchema.pre("حفظ"، دالة (التالي) {
const user = هذا كمستخدم;
إذا (!this.isModified("كلمة المرور")) إرجاع التالي();
bcrypt.genSalt(SALT_WORK_FACTOR، الدالة (خطأ، ملح) {
إذا (خطأ) إرجاع التالي (خطأ);
bcrypt.hash(user.password, salt, function (err, hash) {
إذا (خطأ) أرجع التالي (خطأ);
كلمة مرور المستخدم.password = hash;
التالي();
});
});
});
{...}
ثم أضف طريقة مقارنة كلمات المرور إلى UserSchema:
// src/model.ts
{...}
UserSchema.methods.methods.comparePasswords = الدالة (
كلمة المرور المرشحة: سلسلة,
cb: (خطأ: خطأ | فارغ، نفس الشيء: منطقي | فارغ) => باطل
) {
const user = هذا كمستخدم;
مقارنة bcrypt.compare(candidatePassword, user.password, (خطأ، isMatch) => {
إذا (خطأ) {
إرجاع cb(err, null);
}
cb(فارغ، isMatch);
});
};
{...}
يمكننا الآن ترتيب اتصال بين الخوادم وقواعد البيانات. MONGODB_URI هو متغير بيئة يحتوي على سلسلة الاتصال اللازمة لإنشاء الاتصال. يمكنك الحصول عليها من لوحة المجموعة بعد تسجيل الدخول إلى حساب أطلس MongoDB الخاص بك. ضعه داخل .env
// .env
mongodb_uri = ....;
تذكر دائمًا إضافة هذا الملف إلى .gitignore. عظيم! الآن دعنا نضيف دالة تسمح بالاتصال مع db.
// src/index.ts
استيراد { createLocalServer } من "./Server";
يتطلب("dotenv").config();
const port = process.env.PORT || 4000;
const server = createLocalServer();
الخادم.listen(المنفذ).then(({ url })) =>) {
console.log(``Server ir يعمل على ${url}`);
});
يجب أن تحصل على هذه المعلومات داخل المحطة الطرفية:
الخادم ir يعمل على http://localhost:4000/
إذا كانت الإجابة بنعم، افتح http://localhost:4000/ داخل متصفحك.
يجب أن يظهر ملعب GraphQL. لنقم بإنشاء مستخدم جديد!
ألق نظرة على كيفية ظهورها في قاعدة البيانات.
رائع! كل شيء يعمل بشكل جيد!
دعنا نحاول الحصول على بعض معلومات المستخدم.
وإضافة حقل كلمة المرور...
لطيف! نتلقى خطأ لا يمكن الاستعلام عن حقل "كلمة المرور" على نوع "المستخدم".". كما يمكنك التحقق مرة أخرى، لم نقم بإضافة هذا الحقل داخل تعريف نوع المستخدم. إنه موجود هناك عن قصد. يجب ألا نجعل من الممكن الاستعلام عن أي كلمة مرور أو بيانات حساسة أخرى.
شيء آخر... يمكننا الحصول على بيانات المستخدم دون أي مصادقة... إنه ليس حلاً جيدًا. نحن بحاجة إلى إصلاحه.
ولكن قبل ذلك...
تكوين كودجين
دعونا نستخدم GraphQL الكود مولد للحصول على نوع أساسي متوافق، بناءً على مخططنا.
npm install - حفظ @graphql-codegen/cli @graphql-codegen/introspection
@الجرافكل-كودجين/النص البرمجي @الجرافكل-كودجين/محللات النص البرمجي
إنشاء كودجين.yml
الكتابة فوق: صحيح
مخطط: "http://localhost:4000"
يولد:
./src/generated/graphql.ts:
الإضافات:
- "أنواع المخطوطات"
- "مُحَلِّلات-مخطوطات-مخطوطات"
./graphql.schema.json:
المكونات الإضافية:
- "استبطان"