با درود و خسته نباشید
من تا این جا میدونم که تفاوت اپراتور in با hasOwnProperty در این هست که اپراتور in پروتوتایپ و ارث بری را بررسی میکند ولی hasOwnProperty فقط خود ابجکت را بررسی میکند ولی در آبجکت user نتایج این دو به صورت عجیبی متفاوت است و من دلیلی برای آن پیدا نکردم(یکی ture و یکی false در کد کامنت شده)
exports.getUser = async (req, res, next) => { try { const { id } = req.params; if (!id) { return res.status(404).send({ error: true, message: 'کاربر با این مشخصات یافت نشد' }) } console.log(id) const user = await userModel.findOne({ _id: id }); console.log(user) console.log(user.hasOwnProperty('first_name')) // false console.log('first_name' in user) // ture if (!user) { return res.status(404).send({ error: true, message: 'کاربر با این مشخصات یافت نشد' }) } return res.status(200).send({ success: true, data: user }) } catch (error) { next(error) } }
ولی نکته ی جالب اینجا هست که اگر از طریق متد toObject یوزر را در یک متغییر دیگر بریزیم یا حتی مستقیما آن را به hasOwnProperty پاس بدهیم جواب هر دو متغیر ture میشود.
یک سوال دیگر که داشتم اگه مقدار id هر چیزی غیر از id باشد(حتی یک حرف تفاوت داشته باشد ) به ارور زیر برخورد میکنم و بلافاصله وارد بلاک catch میشود در حالی که اتنظار من این هست که نتایج جستجو خالی یا null باشد و در نتیجه عملا نمیشود status code مناسب قرار داد.
const castError = new CastError(); ^ CastError: Cast to ObjectId failed for value "630b4a26275534a09ea57b4q" (type string) at path "_id" for model "user" at model.Query.exec (/home/hossein/workPlace/RestAPI/node_modules/mongoose/lib/query.js:4803:21) at Query.then (/home/hossein/workPlace/RestAPI/node_modules/mongoose/lib/query.js:4902:15) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) { messageFormat: undefined, stringValue: '"630b4a26275534a09ea57b4q"', kind: 'ObjectId', value: '630b4a26275534a09ea57b4q', path: '_id', reason: BSONTypeError: Argument passed in must be a string of 12 bytes or a string of 24 hex characters or an integer
ممنون از 7learn