



Parse Server هو الواجهة الخلفية مفتوحة المصدر يمكن نشرها في أي بنية تحتية يمكنها تشغيل Node.js. يعمل Parse Server مع إطار تطبيق الويب Express. يمكن إضافته إلى تطبيقات الويب الحالية ، أو تشغيلها بنفسها.
تتوفر الوثائق الكاملة لخادم Parse في الويكي. يعد دليل خادم Parse مكانًا جيدًا للبدء. تتوفر أيضًا دليل API ودليل رمز السحابة. إذا كنت مهتمًا بالتطوير لـ Parse Server ، فسيساعدك دليل التطوير على الإعداد.
شكراً جزيلاً لك على الرعاة والمؤيدين الذين يدعمون تطوير منصة التحليل!
يتوفر Parse Server بنكهات مختلفة على فروع مختلفة:
release-5.xx الطويل (LTS) release-<version>.xx لا تحتوي فروع LTS على فروع ما قبل الإصدار. يتم توفير دعم طويل الأجل (LTS) للإصدار الرئيسي لخادم Parse السابق. على سبيل المثال ، سيتلقى Parse Server 5.x تحديثات الأمان حتى يتم استبدال Parse Server 6.x بواسطة Parse Server 7.x ويصبح إصدار LTS الجديد. بينما يتم نشر الإصدار الرئيسي الحالي على فرع release ، يتم نشر إصدار LTS على release-5.xx الفرعي- release-#.xx
أسرع وأسهل طريقة للبدء هي تشغيل خادم MongoDB و PARSE محليًا.
قبل البدء ، تأكد من تثبيت:
npmيتم اختبار Parse Server بشكل مستمر مع أحدث إصدارات Node.js لضمان التوافق. نتبع خطة دعم Node.js على المدى الطويل واختبار فقط ضد الإصدارات التي يتم دعمها رسميًا ولم تصل إلى تاريخ نهاية العمر.
| إصدار | أحدث إصدار | نهاية الحياة | متناسق |
|---|---|---|---|
| Node.JS 18 | 18.20.4 | أبريل 2025 | ✅ نعم |
| Node.js 20 | 20.15.1 | أبريل 2026 | ✅ نعم |
| Node.js 22 | 22.4.1 | أبريل 2027 | ✅ نعم |
يتم اختبار Parse Server بشكل مستمر مع أحدث إصدارات MongoDB لضمان التوافق. نتبع جدول دعم MongoDB وجدول دورة حياة MongoDB واختبار فقط ضد الإصدارات المدعومة رسميًا ولم تصل إلى تاريخ نهاية العمر. يتم تجاهل MongoDB "الإصدارات السريعة" لأنها تعتبر مسبقًا من الإصدار الرئيسي التالي.
| إصدار | أحدث إصدار | نهاية الحياة | متناسق |
|---|---|---|---|
| MongoDB 4.2 | 4.2.25 | أبريل 2023 | ✅ نعم |
| MongoDB 4.4 | 4.4.29 | فبراير 2024 | ✅ نعم |
| MongoDB 5 | 5.0.26 | أكتوبر 2024 | ✅ نعم |
| MongoDB 6 | 6.0.14 | يوليو 2025 | ✅ نعم |
| MongoDB 7 | 7.0.8 | TDB | ✅ نعم |
| MongoDB 8 | 8.0.0 | TDB | ✅ نعم |
يتم اختبار Parse Server بشكل مستمر مع أحدث إصدارات PostgreSQL و PostGIS لضمان التوافق ، باستخدام صور Docker Postgis. نتبع جدول دعم PostgreSQL وجدول دعم PostGIS واختبار فقط مقابل الإصدارات المدعومة رسميًا ولم تصل إلى تاريخ نهاية العمر. نظرًا لمدة دعم PostgreSQL الواسعة البالغة 5 سنوات ، ينخفض Parse Server عن دعمه قبل حوالي عامين من تاريخ نهاية العمر الرسمي.
| إصدار | إصدار postgis | نهاية الحياة | دعم الخادم | متناسق |
|---|---|---|---|---|
| Postgres 13 | 3.1 ، 3.2 ، 3.3 ، 3.4 ، 3.5 | نوفمبر 2025 | <= 6.x (2023) | ✅ نعم |
| Postgres 14 | 3.5 | نوفمبر 2026 | <= 7.x (2024) | ✅ نعم |
| Postgres 15 | 3.5 | نوفمبر 2027 | <= 8.x (2025) | ✅ نعم |
| Postgres 16 | 3.5 | نوفمبر 2028 | <= 9.x (2026) | ✅ نعم |
| Postgres 17 | 3.5 | نوفمبر 2029 | <= 9.x (2026) | ✅ نعم |
$ npm install -g parse-server mongodb-runner
$ mongodb-runner start
$ parse-server --appId APPLICATION_ID --masterKey MASTER_KEY --databaseURI mongodb://localhost/test ملاحظة: إذا فشل التثبيت مع -g بسبب مشاكل الإذن ( npm ERR! code 'EACCES' ) ، يرجى الرجوع إلى هذا الرابط.
$ git clone https://github.com/parse-community/parse-server
$ cd parse-server
$ docker build --tag parse-server .
$ docker run --name my-mongo -d mongo$ docker run --name my-parse-server -v config-vol:/parse-server/config -p 1337:1337 --link my-mongo:mongo -d parse-server --appId APPLICATION_ID --masterKey MASTER_KEY --databaseURI mongodb://mongo/test ملاحظة: إذا كنت ترغب في استخدام الرمز السحابي ، فأضف -v cloud-code-vol:/parse-server/cloud --cloud /parse-server/cloud/main.js إلى الأمر أعلاه. تأكد من أن main.js موجود في دليل cloud-code-vol قبل بدء تشغيل خادم Parse.
يمكنك استخدام أي سلسلة تعسفية كمعرف التطبيق والمفتاح الرئيسي. سيتم استخدامها من قبل عملائك للمصادقة مع خادم Parse.
هذا كل شيء! تقوم الآن بتشغيل إصدار مستقل من Parse Server على جهازك.
باستخدام mongodb عن بعد؟ تمرير المعلمة- --databaseURI DATABASE_URI عند بدء تشغيل parse-server . تعرف على المزيد حول تكوين خادم تحليل هنا. للحصول على قائمة كاملة بالخيارات المتاحة ، قم بتشغيل parse-server --help .
الآن بعد أن قمت بتشغيل خادم Parse ، فقد حان الوقت لحفظ كائنك الأول. سنستخدم API REST ، ولكن يمكنك بسهولة القيام بنفس الشيء باستخدام أي من SDKs Parse. قم بتشغيل ما يلي:
$ curl -X POST
-H " X-Parse-Application-Id: APPLICATION_ID "
-H " Content-Type: application/json "
-d ' {"score":1337,"playerName":"Sean Plott","cheatMode":false} '
http://localhost:1337/parse/classes/GameScoreيجب أن تحصل على استجابة مماثلة لهذا:
{
"objectId" : "2ntvSpRGIK" ,
"createdAt" : "2016-03-11T23:51:48.050Z"
} يمكنك الآن استرداد هذا الكائن مباشرة (تأكد من استبدال 2ntvSpRGIK مع objectId الفعلي الذي تلقيته عند إنشاء الكائن):
$ curl -X GET
-H " X-Parse-Application-Id: APPLICATION_ID "
http://localhost:1337/parse/classes/GameScore/2ntvSpRGIK // Response
{
"objectId" : " 2ntvSpRGIK " ,
"score" : 1337 ,
"playerName" : " Sean Plott " ,
"cheatMode" : false ,
"updatedAt" : " 2016-03-11T23:51:48.050Z " ,
"createdAt" : " 2016-03-11T23:51:48.050Z "
}الحفاظ على مسارات معرفات الكائن الفردية ليست مثالية ، ولكن. في معظم الحالات ، سترغب في تشغيل استعلام على المجموعة ، مثل ذلك:
$ curl -X GET
-H " X-Parse-Application-Id: APPLICATION_ID "
http://localhost:1337/parse/classes/GameScore // The response will provide all the matching objects within the `results` array:
{
"results" : [
{
"objectId" : " 2ntvSpRGIK " ,
"score" : 1337 ,
"playerName" : " Sean Plott " ,
"cheatMode" : false ,
"updatedAt" : " 2016-03-11T23:51:48.050Z " ,
"createdAt" : " 2016-03-11T23:51:48.050Z "
}
]
}لمعرفة المزيد حول استخدام كائنات حفظ والاستعلام على خادم Parse ، تحقق من وثائق Parse.
يوفر Parse SDKs لجميع المنصات الرئيسية. ارجع إلى دليل خادم Parse لمعرفة كيفية توصيل تطبيقك بخادم Parse.
بمجرد أن يكون لديك فهم أفضل لكيفية عمل المشروع ، يرجى الرجوع إلى Wiki خادم Parse للحصول على أدلة متعمقة لنشر خادم Parse على مقدمي البنية التحتية الرئيسية. تابع القراءة لمعرفة المزيد عن طرق إضافية لتشغيل خادم تحليل.
لقد قدمنا تطبيق Node.js أساسي يستخدم وحدة خادم Parse على Express ويمكن نشرها بسهولة في مختلف مقدمي البنية التحتية:
يمكنك أيضًا إنشاء مثيل من خادم Parse ، وتثبيته على موقع ويب Express جديد أو موجود:
const express = require ( 'express' ) ;
const ParseServer = require ( 'parse-server' ) . ParseServer ;
const app = express ( ) ;
const server = new ParseServer ( {
databaseURI : 'mongodb://localhost:27017/dev' , // Connection string for your MongoDB database
cloud : './cloud/main.js' , // Path to your Cloud Code
appId : 'myAppId' ,
masterKey : 'myMasterKey' , // Keep this key secret!
fileKey : 'optionalFileKey' ,
serverURL : 'http://localhost:1337/parse' // Don't forget to change to https if needed
} ) ;
// Start server
await server . start ( ) ;
// Serve the Parse API on the /parse URL prefix
app . use ( '/parse' , server . app ) ;
app . listen ( 1337 , function ( ) {
console . log ( 'parse-server-example running on port 1337.' ) ;
} ) ; للحصول على قائمة كاملة بالخيارات المتاحة ، قم بتشغيل parse-server --help أو ألقِ نظرة على [تكوينات خادم Parse] [اختيارات الخادم].
تحقق من صحة خادم Parse عن طريق إرسال طلب إلى نقطة النهاية /parse/health .
الاستجابة تبدو هكذا:
{
"status" : " ok "
}| قيمة | وصف |
|---|---|
initialized | تم إنشاء الخادم ولكن لم يتم استدعاء طريقة start بعد. |
starting | يبدأ الخادم. |
ok | بدأ الخادم ويعمل. |
error | كان هناك خطأ في بدء التشغيل ، راجع السجلات للحصول على التفاصيل. |
يمكن تكوين خادم تحليل باستخدام الخيارات التالية. يمكنك تمريرها كمعلمات عند تشغيل parse-server مستقل ، أو عن طريق تحميل ملف تكوين بتنسيق JSON باستخدام parse-server path/to/configuration.json . إذا كنت تستخدم Parse Server على Express ، فيمكنك أيضًا نقلها إلى كائن ParseServer كخيارات.
للحصول على القائمة الكاملة للخيارات المتاحة ، قم بتشغيل parse-server --help أو ألق نظرة على [تكوينات خادم PARSE] [اختيارات الخادم].
appId (مطلوب) - معرف التطبيق للاستضافة مع مثيل الخادم هذا. يمكنك استخدام أي سلسلة تعسفية. للتطبيقات التي تم ترحيلها ، يجب أن يتطابق مع تطبيق Parse المستضافة.masterKey (مطلوب) - المفتاح الرئيسي لاستخدامه في تجاوز أمان ACL. يمكنك استخدام أي سلسلة تعسفية. اجعلها سرية! للتطبيقات التي تم ترحيلها ، يجب أن يتطابق مع تطبيق Parse المستضافة.databaseURI (مطلوب) - سلسلة اتصال لقاعدة البيانات الخاصة بك ، أي mongodb://user:[email protected]/dbname . تأكد من تشفير URL كلمة المرور الخاصة بك إذا كانت كلمة المرور الخاصة بك تحتوي على أحرف خاصة.port - المنفذ الافتراضي هو 1337 ، حدد هذه المعلمة لاستخدام منفذ مختلف.serverURL - url إلى خادم تحليل الخاص بك (لا تنس تحديد http: // أو https: //). سيتم استخدام عنوان URL هذا عند تقديم طلبات إلى تحليل الخادم من الرمز السحابي.cloud - المسار المطلق إلى ملف Cloud Code main.jspush - خيارات التكوين ل APNS و GCM Push. انظر إعلامات الدفع السريعة. لم تعد مفاتيح العميل المستخدمة مع Parse ضرورية مع خادم Parse. إذا كنت ترغب في طلبهم ، ربما لتتمكن من رفض الوصول إلى العملاء الأكبر سناً ، يمكنك تعيين المفاتيح في وقت التهيئة. سيتطلب تعيين أي من هذه المفاتيح جميع الطلبات لتوفير أحد المفاتيح التي تم تكوينها.
clientKeyjavascriptKeyrestAPIKeydotNetKey| نِطَاق | البيانات الداخلية | بيانات القراءة فقط (1) | بيانات مخصصة | مقيد بواسطة CLP ، ACL | مفتاح |
|---|---|---|---|---|---|
| داخلي | ص/ث | ص/ث | ص/ث | لا | maintenanceKey |
| يتقن | -/- | ص/- | ص/ث | لا | masterKey |
| readonlymaster | -/- | ص/- | ص/- | لا | readOnlyMasterKey |
| حصة | -/- | ص/- | ص/ث | نعم | sessionToken |
(1) Parse.Object.createdAt ، Parse.Object.updatedAt .
يتطلب التحقق من عناوين البريد الإلكتروني للمستخدم وتمكين إعادة تعيين كلمة المرور عبر البريد الإلكتروني محول بريد إلكتروني. هناك العديد من محولات البريد الإلكتروني المقدمة والاحتفاظ بها من قبل المجتمع. فيما يلي مثال تكوين مع محول بريد إلكتروني مثال. راجع [خيارات خادم Parse] [خيارات الخادم] لمزيد من التفاصيل وقائمة كاملة من الخيارات المتاحة.
const server = ParseServer ( {
... otherOptions ,
// Enable email verification
verifyUserEmails : true ,
// Set email verification token validity to 2 hours
emailVerifyTokenValidityDuration : 2 * 60 * 60 ,
// Set email adapter
emailAdapter : {
module : 'example-mail-adapter' ,
options : {
// Additional adapter options
... mailAdapterOptions
}
} ,
} ) ;محولات البريد الإلكتروني الخارجية التي تحتفظ بها منصة Parse:
محولات البريد الإلكتروني التي ساهم بها المجتمع:
قم بتعيين سياسة كلمة المرور وحساب تلبي متطلبات الأمان الخاصة بك. ما يلي هو تكوين مثال. راجع [خيارات خادم Parse] [خيارات الخادم] لمزيد من التفاصيل وقائمة كاملة من الخيارات المتاحة.
const server = ParseServer ( {
... otherOptions ,
// The account lock policy
accountLockout : {
// Lock the account for 5 minutes.
duration : 5 ,
// Lock an account after 3 failed log-in attempts
threshold : 3 ,
// Unlock the account after a successful password reset
unlockOnPasswordReset : true ,
} ,
// The password policy
passwordPolicy : {
// Enforce a password of at least 8 characters which contain at least 1 lower case, 1 upper case and 1 digit
validatorPattern : / ^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.{8,}) / ,
// Do not allow the username as part of the password
doNotAllowUsername : true ,
// Do not allow to re-use the last 5 passwords when setting a new password
maxPasswordHistory : 5 ,
} ,
} ) ; تحذير ، هذه ميزة تجريبية قد لا تكون مناسبة للإنتاج.
تسمح الطرق المخصصة ببناء تدفقات المستخدم مع صفحات الويب ، على غرار ميزات إعادة تعيين كلمة المرور الحالية وميزات التحقق من البريد الإلكتروني. يتم تعريف الطرق المخصصة مع خيار pages في تكوين خادم Parse:
const api = new ParseServer ( {
... otherOptions ,
pages : {
enableRouter : true , // Enables the experimental feature; required for custom routes
customRoutes : [ {
method : 'GET' ,
path : 'custom_route' ,
handler : async request => {
// custom logic
// ...
// then, depending on the outcome, return a HTML file as response
return { file : 'custom_page.html' } ;
}
} ]
}
} يمكن استدعاء المسار أعلاه عن طريق إرسال طلب GET على: https://[parseServerPublicUrl]/[parseMount]/[pagesEndpoint]/[appId]/[customRoute]
يتلقى handler request ويعيد صفحة ويب custom_page.html من دليل pages.pagesPath كاستجابة. تتمثل ميزة بناء مسار مخصص بهذه الطريقة في استخدام إمكانات Parse Server المدمجة تلقائيًا ، مثل توطين الصفحات والأصحاب الديناميكي.
يتم استخدام المسارات التالية بالفعل من خلال الميزات المدمجة لخادم Parse ، وبالتالي لا تتوفر للطرق المخصصة. يتم تجاهل الطرق المخصصة مع مزيج متطابق من path method .
| طريق | طريقة HTTP | ميزة |
|---|---|---|
verify_email | GET | التحقق من البريد الإلكتروني |
resend_verification_email | POST | التحقق من البريد الإلكتروني |
choose_password | GET | إعادة تعيين كلمة المرور |
request_password_reset | GET | إعادة تعيين كلمة المرور |
request_password_reset | POST | إعادة تعيين كلمة المرور |
| المعلمة | خياري | يكتب | القيمة الافتراضية | مثال القيم | متغير البيئة | وصف |
|---|---|---|---|---|---|---|
pages | نعم | Object | undefined | - | PARSE_SERVER_PAGES | خيارات صفحات مثل إعادة تعيين كلمة المرور والتحقق من البريد الإلكتروني. |
pages.enableRouter | نعم | Boolean | false | - | PARSE_SERVER_PAGES_ENABLE_ROUTER | true إذا كان يجب تمكين جهاز توجيه الصفحات ؛ هذا مطلوب لأي من خيارات الصفحات ليصبح ساري المفعول. تحذير ، هذه ميزة تجريبية قد لا تكون مناسبة للإنتاج. |
pages.customRoutes | نعم | Array | [] | - | PARSE_SERVER_PAGES_CUSTOM_ROUTES | الطرق المخصصة. تتم إضافة الطرق بالترتيب الذي يتم تعريفه هنا ، والذي يجب مراعاته منذ الطلبات التي تعبر الطرق بطريقة مرتبة. يتم اجتياز الطرق المخصصة بعد طرق البناء مثل إعادة تعيين كلمة المرور والتحقق من البريد الإلكتروني. |
pages.customRoutes.method | String | - | GET ، POST | - | طريقة HTTP للطريق المخصص. | |
pages.customRoutes.path | String | - | custom_page | - | مسار الطريق المخصص. لاحظ أنه يمكن استخدام المسار نفسه إذا كانت method مختلفة ، على سبيل المثال ، يمكن أن يكون لـ Path custom_page طريقين ، مسار GET و POST ، والذي سيتم استدعاؤه وفقًا لطريقة طلب HTTP. | |
pages.customRoutes.handler | AsyncFunction | - | async () => { ... } | - | معالج المسار الذي يتم استدعاؤه عندما يتطابق المسار مع طلب HTTP. إذا لم يرد المعالج صفحة ، فسيتم الرد على الطلب مع 404 Not found. إجابة. |
من الممكن تغيير الصفحات الافتراضية للتطبيق وإعادة توجيه المستخدم إلى مسار أو مجال آخر.
const server = ParseServer ( {
... otherOptions ,
customPages : {
passwordResetSuccess : "http://yourapp.com/passwordResetSuccess" ,
verifyEmailSuccess : "http://yourapp.com/verifyEmailSuccess" ,
parseFrameURL : "http://yourapp.com/parseFrameURL" ,
linkSendSuccess : "http://yourapp.com/linkSendSuccess" ,
linkSendFail : "http://yourapp.com/linkSendFail" ,
invalidLink : "http://yourapp.com/invalidLink" ,
invalidVerificationLink : "http://yourapp.com/invalidVerificationLink" ,
choosePassword : "http://yourapp.com/choosePassword"
}
} ) يمكنك تكوين خادم التحليل باستخدام متغيرات البيئة:
PORT
PARSE_SERVER_APPLICATION_ID
PARSE_SERVER_MASTER_KEY
PARSE_SERVER_DATABASE_URI
PARSE_SERVER_URL
PARSE_SERVER_CLOUDالمنفذ الافتراضي هو 1337 ، لاستخدام منفذ مختلف تعيين متغير بيئة المنفذ:
$ PORT=8080 parse-server --appId APPLICATION_ID --masterKey MASTER_KEY للحصول على القائمة الكاملة لمتغيرات البيئة القابلة للتكوين ، قم بتشغيل parse-server --help أو ألقِ نظرة على تكوين خادم Parse.
يتم توزيع جميع المحولات الرسمية على أنها حزم مخططة على NPM (parse).
تتوفر بعض المحولات التي تم صيانتها جيدًا أيضًا على منظمة وحدات خادم Parse.
يمكنك أيضًا العثور على المزيد من المحولات التي يحتفظ بها المجتمع من خلال البحث على NPM.
يتيح Parse Server للمطورين الاختيار من بين عدة خيارات عند استضافة الملفات:
GridFSBucketAdapter - مدعوم من MongodbS3Adapter - التي تدعمها Amazon S3GCSAdapter - مدعوم بتخزين Google CloudFSAdapter - تخزين الملفات المحلية يتم استخدام GridFSBucketAdapter افتراضيًا ولا يتطلب أي إعداد ، ولكن إذا كنت مهتمًا باستخدام Amazon S3 أو Google Cloud Storage أو تخزين الملفات المحلية ، تتوفر معلومات تكوين إضافية في دليل خادم Parse.
تحذير ، هذه ميزة تجريبية قد لا تكون مناسبة للإنتاج.
تتميز هذه الميزة بطلبات مماثلة يتم استلامها بواسطة Parse Server عدة مرات ، وعادةً ما تكون بسبب مشكلات الشبكة أو قيود الوصول إلى محول الشبكة على أنظمة تشغيل الأجهزة المحمولة.
يتم تحديد الطلبات المتطابقة من خلال معرف طلب طلب X-Parse-Request-Id . لذلك يجب أن يتضمن طلب العميل هذا الرأس لتطبيق إلغاء البيانات المستهلكة. لا يمكن تكريس الطلبات التي لا تحتوي على هذا الرأس ومعالجتها بشكل طبيعي بواسطة Parse Server. هذا يعني أن طرح هذه الميزة إلى العملاء سلس لأن Parse Server لا يزال يعالج الطلبات بدون هذا الرأس عند تمكين هذه الميزة.
يجب تمكين هذه الميزة على جانب العميل لإرسال الرأس وعلى الخادم لمعالجة الرأس. ارجع إلى مستندات SDK المحددة لمعرفة ما إذا كانت الميزة مدعومة بعد.
لا يتم إلغاء البيانات المستهلكة إلا لإنشاء الكائنات وتحديثها ( POST PUT ). لم يتم إجراء إلغاء البيانات المستهلكة لإيجاد الكائنات وحذفها ( GET الطلبات DELETE ) ، لأن هذه العمليات هي بالفعل معرضة للتعريف.
let api = new ParseServer({
idempotencyOptions: {
paths: [".*"], // enforce for all requests
ttl: 120 // keep request IDs for 120s
}
}
| المعلمة | خياري | يكتب | القيمة الافتراضية | مثال القيم | متغير البيئة | وصف |
|---|---|---|---|---|---|---|
idempotencyOptions | نعم | Object | undefined | parse_server_experimental_idempotency_options | يتيح تحديد هذا إنفاذ الخطر للمسارات المحددة. | |
idempotencyOptions.paths | نعم | Array<String> | [] | .* (جميع المسارات ، تشمل الأمثلة أدناه) ،functions/.* (جميع الوظائف) ،jobs/.* (جميع الوظائف) ،classes/.* (جميع الفصول) ،functions/.* (جميع الوظائف) ،users (إنشاء / تحديث المستخدم) ،installations (إنشاء / تحديث التثبيت) | parse_server_experimental_idempotency_paths | مجموعة من أنماط المسار التي يجب أن تتطابق مع مسار الطلب لتمكين إلغاء البيانات المكررة للطلب. يجب عدم تضمين مسار Mount ، على سبيل المثال لمطابقة مسار الطلب /parse/functions/myFunction حدد functions/myFunction . يتم تجاهل القطع المدمجة لمسار الطلب ، على سبيل المثال functions/myFunction يطابق كل من /parse/functions/myFunction و /parse/functions/myFunction/ . |
idempotencyOptions.ttl | نعم | Integer | 300 | 60 (60 ثانية) | parse_server_experimental_idempotency_ttl | المدة بالثواني التي يتم بعدها تجاهل سجل الطلب من قاعدة البيانات. من المتوقع أن تصل الطلبات المكررة بسبب مشكلات الشبكة إلى ضمن مللي ثانية حتى عدة ثوان. يجب أن تكون هذه القيمة أكبر من 0 . |
لاستخدام هذه الميزة في Postgres ، ستحتاج إلى إنشاء وظيفة cron باستخدام pgadmin أو ما شابه ذلك لدعوة وظيفة postgres idempotency_delete_expired_records() التي تحذف سجلات Idempotency المنتهية الصلاحية. يمكنك العثور على نص مثال أدناه. تأكد من أن البرنامج النصي لديه نفس الامتيازات لتسجيل الدخول إلى Postgres كخادم Parse.
#! /bin/bash
set -e
psql -v ON_ERROR_STOP=1 --username " $POSTGRES_USER " --dbname " $POSTGRES_DB " << - EOSQL
SELECT idempotency_delete_expired_records();
EOSQL
exec " $@ " على افتراض أن البرنامج النصي أعلاه ، تم تسمية parse_idempotency_delete_expired_records.sh ، قد تبدو وظيفة cron التي تدير البرنامج النصي كل دقيقتين:
2 * * * * /root/parse_idempotency_delete_expired_records.sh > /dev/null 2>&1 تحذير ، هذه ميزة تجريبية قد لا تكون مناسبة للإنتاج.
يمكن ترجمة الصفحات المخصصة وكذلك صفحات الميزات (على سبيل المثال إعادة تعيين كلمة المرور ، التحقق من البريد الإلكتروني) مع خيار pages في تكوين خادم Parse:
const api = new ParseServer ( {
... otherOptions ,
pages : {
enableRouter : true , // Enables the experimental feature; required for localization
enableLocalization : true ,
}
} يتم تحقيق التوطين من خلال مطابقة معلمة locale مقدمة الطلب مع محتوى الصفحة المحلية. يمكن تزويد اللغة الإضافية إما في استفسار طلب أو جسم أو رأس مع المفاتيح التالية:
localelocalex-parse-page-param-localeعلى سبيل المثال ، يمكن أن يبدو رابط إعادة تعيين كلمة المرور مع المعلمة المحلية في الاستعلام مثل هذا:
http://example.com/parse/apps/[appId]/request_password_reset?token=[token]&username=[username]&locale=de-AT
pages.pagesPath .pages.customUrls ، حتى إذا كانت عنوان URL المخصص يشير إلى الصفحات داخل مسار الصفحات..html فقط للتوطين عند توطين الصفحات المخصصة.يمكن ترجمة الصفحات بطريقتين:
يتم توطين الصفحات باستخدام الملف المقابل في بنية الدليل حيث يتم وضع الملفات في الدلائل الفرعية التي تم تسميتها على بعد اللغة أو اللغة. الملف في الدليل الأساسي هو الملف الافتراضي.
مثال بنية الدليل:
root /
├── public / // pages base path
│ ├── example . html // default file
│ └── de / // de language folder
│ │ └── example . html // de localized file
│ └── de - AT / // de-AT locale folder
│ │ └── example . html // de-AT localized fileتتم مطابقة الملفات مع اللغة بالترتيب التالي:
de-AT في المجلد de-AT .de-CH تطابق ملف في المجلد de .مثال على التكوين:
const api = new ParseServer ( {
... otherOptions ,
pages : {
enableRouter : true , // Enables the experimental feature; required for localization
enableLocalization : true ,
customUrls : {
passwordReset : 'https://example.com/page.html'
}
}
}الايجابيات:
سلبيات:
يتم ترجمة الصفحات عن طريق إضافة أصحاب نائبة في ملفات HTML وتوفير مورد JSON الذي يحتوي على الترجمات لملء العناصر النائبة.
مثال بنية الدليل:
root /
├── public / // pages base path
│ ├── example . html // the page containing placeholders
├── private / // folder outside of public scope
│ └── translations . json // JSON resource fileيتبع ملف مورد JSON بشكل فضفاض بناء جملة I18Next ، وهو بناء جملة يتم دعمه غالبًا بواسطة منصات الترجمة ، مما يجعل من السهل إدارة الترجمات ، وتصديرها للاستخدام في Parse Server ، وحتى لأتمتة سير العمل هذا.
مثال على محتوى JSON:
{
"en" : { // resource for language `en` (English)
"translation" : {
"greeting" : " Hello! "
}
},
"de" : { // resource for language `de` (German)
"translation" : {
"greeting" : " Hallo! "
}
}
"de-AT" : { // resource for locale `de-AT` (Austrian German)
"translation" : {
"greeting" : " Servus! "
}
}
}مثال على التكوين:
const api = new ParseServer ( {
... otherOptions ,
pages : {
enableRouter : true , // Enables the experimental feature; required for localization
enableLocalization : true ,
localizationJsonPath : './private/localization.json' ,
localizationFallbackLocale : 'en'
}
}الايجابيات:
سلبيات:
بالإضافة إلى المعلمات الافتراضية ذات الصلة مثل appId والترجمات المقدمة عبر مورد JSON ، من الممكن تحديد العناصر النائبة الديناميكية المخصصة كجزء من تكوين جهاز التوجيه. هذا يعمل بشكل مستقل عن التوطين ، وأيضًا إذا تم تعطيل enableLocalization .
مثال على التكوين:
const api = new ParseServer ( {
... otherOptions ,
pages : {
enableRouter : true , // Enables the experimental feature; required for localization
placeholders : {
exampleKey : 'exampleValue'
}
}
} يمكن أيضًا توفير العناصر النائبة كدالة أو كدالة ASYNC ، مع تمرير المعلمات locale وغيرها من المعلمات ذات الصلة بالميزات ، للسماح بقيم العناصر النائية الديناميكية:
const api = new ParseServer ( {
... otherOptions ,
pages : {
enableRouter : true , // Enables the experimental feature; required for localization
placeholders : async ( params ) => {
const value = await doSomething ( params . locale ) ;
return {
exampleKey : value
} ;
}
}
} يتم حجز المعلمة والمعلمة التالية ومفاتيح العناصر النائمة لأنها تستخدم فيما يتعلق بميزات مثل إعادة تعيين كلمة المرور أو التحقق من البريد الإلكتروني. لا ينبغي استخدامها كمفاتيح للترجمة في مورد JSON أو كمفاتيح للمصدر النائب المحدد يدويًا في التكوين: appId ، appName ، email ، error ، locale ، publicServerUrl ، token ، username .
| المعلمة | خياري | يكتب | القيمة الافتراضية | مثال القيم | متغير البيئة | وصف |
|---|---|---|---|---|---|---|
pages | نعم | Object | undefined | - | PARSE_SERVER_PAGES | خيارات صفحات مثل إعادة تعيين كلمة المرور والتحقق من البريد الإلكتروني. |
pages.enableRouter | نعم | Boolean | false | - | PARSE_SERVER_PAGES_ENABLE_ROUTER | true إذا كان يجب تمكين جهاز توجيه الصفحات ؛ هذا مطلوب لأي من خيارات الصفحات ليصبح ساري المفعول. تحذير ، هذه ميزة تجريبية قد لا تكون مناسبة للإنتاج. |
pages.enableLocalization | نعم | Boolean | false | - | PARSE_SERVER_PAGES_ENABLE_LOCALIZATION | صحيح إذا كان ينبغي ترجمة الصفحات ؛ هذا ليس له أي تأثير على إعادة توجيه الصفحة المخصصة. |
pages.localizationJsonPath | نعم | String | undefined | ./private/translations.json | PARSE_SERVER_PAGES_LOCALIZATION_JSON_PATH | المسار إلى ملف JSON للتوطين ؛ سيتم استخدام الترجمات لملء العناصر النائبة للقالب وفقًا للمحطة. |
pages.localizationFallbackLocale | نعم | String | en | en ، en-GB ، default | PARSE_SERVER_PAGES_LOCALIZATION_FALLBACK_LOCALE | لغة العودة للتوطين إذا لم يتم توفير ترجمة مطابقة للمكان المحدد. هذا مهم فقط عند توفير موارد الترجمة عبر ملف JSON. |
pages.placeholders | نعم | Object ، Function ، AsyncFunction | undefined | { exampleKey: 'exampleValue' } | PARSE_SERVER_PAGES_PLACEHOLDERS | مفاتيح وقيم العنصر النائب الذي سيتم ملؤه في الصفحات ؛ يمكن أن يكون هذا كائنًا بسيطًا أو وظيفة رد اتصال. |
pages.forceRedirect | نعم | Boolean | false | - | PARSE_SERVER_PAGES_FORCE_REDIRECT | true إذا كان يجب دائمًا إعادة توجيه الاستجابات وعدم المحتوى أبدًا ، false إذا كان يجب أن يعتمد نوع الاستجابة على نوع الطلب ( GET طلب -> استجابة للمحتوى ؛ طلب POST -> إعادة توجيه الاستجابة). |
pages.pagesPath | نعم | String | ./public | ./files/pages ، ../../pages | PARSE_SERVER_PAGES_PAGES_PATH | الطريق إلى دليل الصفحات ؛ هذا يحدد أيضًا مكان تشير نقطة النهاية /apps الثابتة إلى. |
pages.pagesEndpoint | نعم | String | apps | - | PARSE_SERVER_PAGES_PAGES_ENDPOINT | نقطة نهاية API للصفحات. |
pages.customUrls | نعم | Object | {} | { passwordReset: 'https://example.com/page.html' } | PARSE_SERVER_PAGES_CUSTOM_URLS | عناوين URL للصفحات المخصصة |
pages.customUrls.passwordReset | نعم | String | password_reset.html | - | PARSE_SERVER_PAGES_CUSTOM_URL_PASSWORD_RESET | عنوان URL إلى الصفحة المخصصة لإعادة تعيين كلمة المرور. |
pages.customUrls.passwordResetSuccess | نعم | String | password_reset_success.html | - | PARSE_SERVER_PAGES_CUSTOM_URL_PASSWORD_RESET_SUCCESS | عنوان URL إلى الصفحة المخصصة لإعادة تعيين كلمة المرور -> النجاح. |
pages.customUrls.passwordResetLinkInvalid | نعم | String | password_reset_link_invalid.html | - | PARSE_SERVER_PAGES_CUSTOM_URL_PASSWORD_RESET_LINK_INVALID | عنوان URL إلى الصفحة المخصصة لإعادة تعيين كلمة المرور -> الرابط غير صالح. |
pages.customUrls.emailVerificationSuccess | نعم | String | email_verification_success.html | - | PARSE_SERVER_PAGES_CUSTOM_URL_EMAIL_VERIFICATION_SUCCESS | عنوان URL إلى الصفحة المخصصة للتحقق من البريد الإلكتروني -> النجاح. |
pages.customUrls.emailVerificationSendFail | نعم | String | email_verification_send_fail.html | - | PARSE_SERVER_PAGES_CUSTOM_URL_EMAIL_VERIFICATION_SEND_FAIL | عنوان URL إلى الصفحة المخصصة للتحقق من البريد الإلكتروني -> ارتباط إرسال فشل. |
pages.customUrls.emailVerificationSendSuccess | نعم | String | email_verification_send_success.html | - | PARSE_SERVER_PAGES_CUSTOM_URL_EMAIL_VERIFICATION_SEND_SUCCESS | عنوان URL إلى الصفحة المخصصة للتحقق من البريد الإلكتروني -> إعادة إرسال رابط -> النجاح. |
pages.customUrls.emailVerificationLinkInvalid | نعم | String | email_verification_link_invalid.html | - | PARSE_SERVER_PAGES_CUSTOM_URL_EMAIL_VERIFICATION_LINK_INVALID | عنوان URL إلى الصفحة المخصصة للتحقق من البريد الإلكتروني -> الرابط غير صالح. |
pages.customUrls.emailVerificationLinkExpired | نعم | String | email_verification_link_expired.html | - | PARSE_SERVER_PAGES_CUSTOM_URL_EMAIL_VERIFICATION_LINK_EXPIRED | عنوان URL إلى الصفحة المخصصة للتحقق من البريد الإلكتروني -> انتهت صلاحية الرابط. |
سيقوم Parse Server ، افتراضيًا ، بسجل:
السجلات يمكن عرضها أيضًا في لوحة معلومات Parse.
تريد تسجيل كل طلب واستجابة؟ قم بتعيين متغير البيئة VERBOSE عند بدء تشغيل parse-server . الاستخدام:- VERBOSE='1' parse-server --appId APPLICATION_ID --masterKey MASTER_KEY
تريد وضع السجلات في مجلد مختلف؟ تمرير متغير بيئة PARSE_SERVER_LOGS_FOLDER عند بدء تشغيل parse-server . الاستخدام:- PARSE_SERVER_LOGS_FOLDER='<path-to-logs-folder>' parse-server --appId APPLICATION_ID --masterKey MASTER_KEY
تريد تسجيل مستويات محددة؟ تمرير المعلمة logLevel عند بدء تشغيل parse-server . الاستخدام: parse-server --appId APPLICATION_ID --masterKey MASTER_KEY --logLevel LOG_LEVEL
هل تريد سجلات أخطاء JSON المحددة سطرًا جديدًا (للاستهلاك بواسطة CloudWatch ، وتسجيل سحابة Google ، إلخ)؟ تمرير متغير بيئة JSON_LOGS عند بدء تشغيل parse-server . الاستخدام:- JSON_LOGS='1' parse-server --appId APPLICATION_ID --masterKey MASTER_KEY
انظر خطة الإهمال للحصول على نظرة عامة على الانخفاضات والتغييرات المخطط لها.
من المفترض أن يتم استخدام الاستعلامات الحية في التطبيقات التفاعلية في الوقت الفعلي ، حيث يمكن أن يسبب فقط استخدام نموذج الاستعلام التقليدي العديد من المشكلات ، مثل زيادة وقت الاستجابة واستخدام الشبكة والخادم العالي. يجب استخدام الاستعلامات الحية في الحالات التي تحتاج فيها إلى تحديث صفحة باستمرار مع بيانات جديدة قادمة من قاعدة البيانات ، والتي تحدث غالبًا في (على سبيل المثال لا الحصر) للألعاب عبر الإنترنت ، وعملاء المراسلة وقوائم المهام المشتركة.
ألقِ نظرة على دليل الاستعلام المباشر ودليل إعداد خادم الاستعلام المباشر ومواصفات بروتوكول الاستعلام المباشر. يمكنك إعداد خادم مستقل أو مثيلات متعددة لقابلية التوسع (الموصى بها).
GraphQL ، التي تم تطويرها بواسطة Facebook ، هي لغة استعلام ومعالجة بيانات مفتوحة المصدر لواجهة برمجة التطبيقات. بالإضافة إلى واجهة برمجة تطبيقات REST التقليدية ، يقوم Parse Server تلقائيًا بإنشاء واجهة برمجة تطبيقات GraphQL استنادًا إلى مخطط التطبيق الحالي. يتيح لك Parse Server أيضًا تحديد استعلامات وطفرات GraphQL المخصصة ، والتي يمكن أن تكون محدداتها مرتبطة بوظائف رمز السحابة الخاص بك.
أسهل طريقة لتشغيل Parse GraphQL API هي من خلال CLI:
$ npm install -g parse-server mongodb-runner
$ mongodb-runner start
$ parse-server --appId APPLICATION_ID --masterKey MASTER_KEY --databaseURI mongodb://localhost/test --publicServerURL http://localhost:1337/parse --mountGraphQL --mountPlaygroundبعد بدء تشغيل الخادم ، يمكنك زيارة http: // localhost: 1337/playground في متصفحك للبدء في اللعب باستخدام واجهة برمجة تطبيقات GraphQL الخاصة بك.
ملاحظة: لا تستخدم -خيار Mountplayground في الإنتاج. يحتوي Parse Dashboard على ملعب GraphQL مدمج وهو الخيار الموصى به لتطبيقات الإنتاج.
يمكنك أيضًا تشغيل API Parse GraphQL داخل حاوية Docker:
$ git clone https://github.com/parse-community/parse-server
$ cd parse-server
$ docker build --tag parse-server .
$ docker run --name my-mongo -d mongo$ docker run --name my-parse-server --link my-mongo:mongo -v config-vol:/parse-server/config -p 1337:1337 -d parse-server --appId APPLICATION_ID --masterKey MASTER_KEY --databaseURI mongodb://mongo/test --publicServerURL http://localhost:1337/parse --mountGraphQL --mountPlayground ملاحظة: إذا كنت ترغب في استخدام الرمز السحابي ، فأضف -v cloud-code-vol:/parse-server/cloud --cloud /parse-server/cloud/main.js إلى الأمر أعلاه. تأكد من أن main.js موجود في دليل cloud-code-vol قبل بدء تشغيل خادم Parse.
بعد بدء تشغيل الخادم ، يمكنك زيارة http: // localhost: 1337/playground في متصفحك للبدء في اللعب باستخدام واجهة برمجة تطبيقات GraphQL الخاصة بك.
ملاحظة: لا تستخدم -خيار Mountplayground في الإنتاج. يحتوي Parse Dashboard على ملعب GraphQL مدمج وهو الخيار الموصى به لتطبيقات الإنتاج.
يمكنك أيضًا تثبيت API GraphQL في تطبيق Express.js مع API REST أو SOLO. تحتاج أولاً إلى إنشاء مشروع جديد وتثبيت التبعيات المطلوبة:
$ mkdir my-app
$ cd my-app
$ npm install parse-server express --save ثم ، قم بإنشاء ملف index.js مع المحتوى التالي:
const express = require ( 'express' ) ;
const { ParseServer , ParseGraphQLServer } = require ( 'parse-server' ) ;
const app = express ( ) ;
const parseServer = new ParseServer ( {
databaseURI : 'mongodb://localhost:27017/test' ,
appId : 'APPLICATION_ID' ,
masterKey : 'MASTER_KEY' ,
serverURL : 'http://localhost:1337/parse' ,
publicServerURL : 'http://localhost:1337/parse'
} ) ;
const parseGraphQLServer = new ParseGraphQLServer (
parseServer ,
{
graphQLPath : '/graphql' ,
playgroundPath : '/playground'
}
) ;
app . use ( '/parse' , parseServer . app ) ; // (Optional) Mounts the REST API
parseGraphQLServer . applyGraphQL ( app ) ; // Mounts the GraphQL API
parseGraphQLServer . applyPlayground ( app ) ; // (Optional) Mounts the GraphQL Playground - do NOT use in Production
await parseServer . start ( ) ;
app . listen ( 1337 , function ( ) {
console . log ( 'REST API running on http://localhost:1337/parse' ) ;
console . log ( 'GraphQL API running on http://localhost:1337/graphql' ) ;
console . log ( 'GraphQL Playground running on http://localhost:1337/playground' ) ;
} ) ;وأخيراً ابدأ تطبيقك:
$ npx mongodb-runner start
$ node index.jsبعد بدء التطبيق ، يمكنك زيارة http: // localhost: 1337/playground في متصفحك للبدء في اللعب باستخدام واجهة برمجة تطبيقات GraphQL الخاصة بك.
ملاحظة: لا تقم بتركيب ملعب GraphQL في الإنتاج. يحتوي Parse Dashboard على ملعب GraphQL مدمج وهو الخيار الموصى به لتطبيقات الإنتاج.
قم بتشغيل ما يلي:
query Health {
health
}يجب أن تتلقى الرد التالي:
{
"data" : {
"health" : true
}
} نظرًا لأن تطبيقك لا يحتوي على أي مخطط حتى الآن ، يمكنك استخدام طفرة createClass لإنشاء فصلك الأول. قم بتشغيل ما يلي:
mutation CreateClass {
createClass (
name : " GameScore "
schemaFields : {
addStrings : [{ name : " playerName " }]
addNumbers : [{ name : " score " }]
addBooleans : [{ name : " cheatMode " }]
}
) {
name
schemaFields {
name
__typename
}
}
}يجب أن تتلقى الرد التالي:
{
"data" : {
"createClass" : {
"name" : " GameScore " ,
"schemaFields" : [
{
"name" : " objectId " ,
"__typename" : " SchemaStringField "
},
{
"name" : " updatedAt " ,
"__typename" : " SchemaDateField "
},
{
"name" : " createdAt " ,
"__typename" : " SchemaDateField "
},
{
"name" : " playerName " ,
"__typename" : " SchemaStringField "
},
{
"name" : " score " ,
"__typename" : " SchemaNumberField "
},
{
"name" : " cheatMode " ,
"__typename" : " SchemaBooleanField "
},
{
"name" : " ACL " ,
"__typename" : " SchemaACLField "
}
]
}
}
} تعلمت Parse Server من الفئة الأولى التي قمت بإنشائها والآن لديك فئة GameScore في المخطط الخاص بك. يمكنك الآن البدء في استخدام العمليات التي تم إنشاؤها تلقائيًا!
قم بتشغيل ما يلي لإنشاء كائنك الأول:
mutation CreateGameScore {
createGameScore (
fields : {
playerName : " Sean Plott "
score : 1337
cheatMode : false
}
) {
id
updatedAt
createdAt
playerName
score
cheatMode
ACL
}
}يجب أن تتلقى استجابة مماثلة لهذا:
{
"data" : {
"createGameScore" : {
"id" : " XN75D94OBD " ,
"updatedAt" : " 2019-09-17T06:50:26.357Z " ,
"createdAt" : " 2019-09-17T06:50:26.357Z " ,
"playerName" : " Sean Plott " ,
"score" : 1337 ,
"cheatMode" : false ,
"ACL" : null
}
}
}يمكنك أيضًا تشغيل استعلام لهذا الفصل الجديد:
query GameScores {
gameScores {
results {
id
updatedAt
createdAt
playerName
score
cheatMode
ACL
}
}
}يجب أن تتلقى استجابة مماثلة لهذا:
{
"data" : {
"gameScores" : {
"results" : [
{
"id" : " XN75D94OBD " ,
"updatedAt" : " 2019-09-17T06:50:26.357Z " ,
"createdAt" : " 2019-09-17T06:50:26.357Z " ,
"playerName" : " Sean Plott " ,
"score" : 1337 ,
"cheatMode" : false ,
"ACL" : null
}
]
}
}
}يتيح لك خادم Parse GraphQL إنشاء مخطط GraphQL مخصص مع استفسارات وطفرات خاصة لدمج مع تلك التي تم إنشاؤها تلقائيًا. يمكنك حل هذه العمليات باستخدام وظائف رمز السحابة العادي.
للبدء في إنشاء مخططك المخصص ، تحتاج إلى ترميز ملف schema.graphql وتهيئة خادم التحليل باستخدام --graphQLSchema و- --cloud :
$ parse-server --appId APPLICATION_ID --masterKey MASTER_KEY --databaseURI mongodb://localhost/test --publicServerURL http://localhost:1337/parse --cloud ./cloud/main.js --graphQLSchema ./cloud/schema.graphql --mountGraphQL --mountPlayground استخدم الكود أدناه لملفات schema.graphql و main.js ثم أعد تشغيل خادم التحليل الخاص بك.
# schema.graphql
extend type Query {
hello : String ! @resolve
} // main.js
Parse . Cloud . define ( 'hello' , async ( ) => {
return 'Hello world!' ;
} ) ;يمكنك الآن تشغيل استعلامك المخصص باستخدام GraphQL Playground:
query {
hello
}يجب أن تتلقى الرد أدناه:
{
"data" : {
"hello" : " Hello world! "
}
}يعد دليل Parse GraphQL مصدرًا جيدًا جدًا لتعلم كيفية استخدام Parse GraphQL API.
لديك أيضًا أداة قوية للغاية داخل ملعب GraphQL. يرجى إلقاء نظرة على الجانب الأيمن من ملعب GraphQL الخاص بك. سترى قوائم DOCS SCHEMA . يتم إنشاءها تلقائيًا عن طريق تحليل مخطط التطبيق الخاص بك. يرجى الرجوع إليهم ومعرفة المزيد عن كل ما يمكنك القيام به مع Parse GraphQL API.
بالإضافة إلى ذلك ، يعد قسم Learn GraphQL مصدرًا جيدًا للغاية لمعرفة المزيد حول قوة لغة GraphQL.
يرجى الاطلاع على دليل المساهمة.
هذا المشروع موجود بفضل جميع الأشخاص الذين يساهمون ... نود أن نرى وجهك في هذه القائمة!
دعم هذا المشروع من خلال أن يصبح راعياً. سيظهر شعارك هنا مع رابط لموقع الويب الخاص بك. كن راعيا!
دعمنا بتبرع شهري ومساعدتنا على مواصلة أنشطتنا. كن مؤيدًا!
[Server-Options] http://parseplatform.org/parse-server/api/Release/ParseserverOptions.html