Back/Node.js

Node.js 검색 기능

Node.js 검색 기능

router.post('/searchUser', async (req, res) => {
	try {
		const { words } = req.body;
		if (!words) {
			res.send({ userInfo: 'none' });
		}
		// ({ userId: { $ne: user.userId }, questionId: questionId })
		const userInfo = await User.find(
			{ provider: { $ne: '탈퇴' }, nickname: new RegExp(`${words}`) },
			{ createdAt: 0, updatedAt: 0, provider: 0, socialId: 0 }
		);
		if (userInfo) {
			res.send({ userInfo });
		} else {
			res.send({ userInfo: 'none' });
		}
	} catch (err) {
		return res.status(400).json({ msg: 'fail' });
	}
});

 

// 유저검색 완료(검색 유저 클릭했을때)
router.post('/searchUserDetail', async (req, res) => {
	try {
		const { id } = req.body;
		const { authorization } = req.headers;
		if (!id) {
			res.send({ userInfo: 'none' });
		}
		if (!authorization) {
			return res.status(200).send({ msg: '로그인 안 하고 검색했습니다!' });
		}

		const [tokenType, tokenValue] = authorization.split(' ');
		if (tokenType !== 'Bearer') return res.json({ msg: 'fail' });
		const { userId } = jwt.verify(tokenValue, process.env.LOVE_JWT_SECRET);

		const myUserInfo = await User.findOne({ _id: userId }); // 내 ID
		let otherUserInfo = await User.findOne(
			{ _id: id },
			{ createdAt: 0, updatedAt: 0, provider: 0, socialId: 0 }
		); // 다른사람 ID

		const checkSearch = await Search.find({
			searchUserId: otherUserInfo._id,
			userId: myUserInfo.userId
		});
		const checkAllSearch = await Search.find({ userId: myUserInfo.userId });

		if (checkAllSearch.length >= 6) {
			await Search.deleteOne({ userId: myUserInfo.userId });
		}

		if (!checkSearch) {
			const result = await Search.create({
				searchUserId: otherUserInfo._id,
				userId: userId,
				YYMMDD: moment().format('YYMMDD')
			});
			return res.json({ result });
		} else {
			if (checkSearch.length >= 2) {
				await Search.deleteOne({
					searchUserId: otherUserInfo._id,
					userId: myUserInfo.userId
				});
			}
			await Search.deleteOne({ searchUserId: otherUserInfo._id, userId: myUserInfo.userId });
			const result = await Search.create({
				searchUserId: otherUserInfo._id,
				userId: userId,
				YYMMDD: moment().format('YYMMDD')
			});
			return res.json({ result });
		}
	} catch (err) {
		console.log(err);
		return res.status(400).json({ msg: 'fail' });
	}
});

// 최신 유저 검색 목록
router.get('/searchUser', async (req, res) => {
	const { authorization } = req.headers;
	let result = { msg: 'success', searchUser: [] };
	try {
		let standardTime = moment(Date.now() - 1000 * 60 * 60 * 24 * 30).format('YYMMDD');
		// 로그인 했을때
		if (authorization) {
			const [tokenType, tokenValue] = authorization.split(' ');
			if (tokenType !== 'Bearer') return res.json({ msg: 'fail' });
			const { userId } = jwt.verify(tokenValue, process.env.LOVE_JWT_SECRET);
			const user = await User.findOne({ _id: userId });
			if (!user) {
				throw 'undefined user!';
			}

			const users = await Search.find({ userId: userId })
				.where('YYMMDD')
				.gt(standardTime)
				.limit(5);
			for (let userData of users) {
				const userInfo = await User.findOne({ _id: userData.searchUserId });
				let temp = {
					profileImg: userInfo['profileImg'],
					nickname: userInfo.nickname,
					searchUserId: userData.searchUserId,
					userId: userData.userId
				};
				result['searchUser'].push(temp);
			}
			res.status(200).json({ result });
		}
	} catch (err) {
		return res.status(400).json({ msg: 'fail' });
	}
});

 

오랜만에..ㅠㅠ

 

User db에 들려서 provider값이 '탈퇴'인 것을 제외하고, body에서 받아온 words를 전부 검색한다.

클라단에서는 타이핑이 끝나고 0.5초뒤에 api를 요청하기 때문에, 1글자든 3글자든 db에서 검색 후 내려줄 수 있다.

최신 유저 검색을 내려줘야하기 때문에 따로 db를 하나 팠다.

검색을 완료했을 때 api를 한 번 더 요청받고, 그때 db에 어떤 유저가 어떤 유저를 검색했는지 db에 넣었당.

'Back > Node.js' 카테고리의 다른 글

node.js ssl & https  (0) 2021.05.15
Node.js Mongodb aggregate lookup  (0) 2021.05.12
Node.js 유저인증 미들웨어  (0) 2021.04.12
Node.js passport 이용한 구글 로그인  (0) 2021.04.11
Node.js 친구가 쓴 글만 내려주기 [MongoDB]  (0) 2021.04.08