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 |