Nodejsapi에서 주변 사용자를 찾을 수 있는 지리적 인코딩 기능 구축
이 강좌에서 저는 사용자의 마지막 로그인 위치를 정확하게 추적하여 데이터베이스에 저장/갱신하고 이 데이터베이스를 플랫폼의 모든 사용자에게 추천하는 방법을 보여 드리겠습니다.
선결 조건
Guide
- Clone and Test the boilerplate code
- Write mongodb/mongoose schema with 2dsphere index.
- Install, configure and use express-ip to grab location users made http request from.
- Query user model for other users around a particular user.
템플릿 코드 복제 및 테스트
1. git clone https://github.com/WonderfulOlanrewaju/nearby-api-boilerplate.git
2. cd /nearby-api-boilerplate
3. yarn install && yarn add cross-env
위의 세 가지 명령은 원격 Repo를 현재 작업 디렉터리에 복제하는 명령입니다.Command two는 디렉터리를 복사된 폴더로 변경하고 명령 트리에 템플릿 코드를 실행하는 데 필요한 모든 의존 항목을 설치하고 JWT를 등록하고 로그인합니다.만들다.env 파일, 환경 변수 추가
secretKey = yoursecretkeyvalue
우체부를 통해api에 샘플 등록 요청postman을 통해api에 예시 로그인 요청 보내기
2dsphere 인덱스를 사용하여mongodb/mongose 모드를 작성합니다.
파일을 만들려면 다음과 같이 하십시오.
src/controllers/utils/updateLocation.회사 명
import { User } from "../../models/User.model";
export const UpdateLastLocation = async (ipInfo, userId) => {
let lastLocation = {
type: "Point",
coordinates: ipInfo.ll,
};
let savedUser = await User.findByIdAndUpdate(
userId,
{
ipInfo,
lastLocation,
},
{ new: true }
);
return savedUser;
};
이것은 우리가 사용자의 위치를 추적하고 싶은 모든 노선에서 사용자의 로그인도와 위도를 추출하여 데이터베이스에 있는 사용자 대상의 일부 필드에 저장하는 실용적인 기능입니다.다음 단계는 ip Info와 사용자의 마지막 위치를 데이터베이스에 저장할 수 있도록 사용자 모델을 업데이트하는 것입니다.
파일 만들기
src/models/User.모델회사 명
import Mongoose from "mongoose";
import autoIncrement from "mongoose-auto-increment";
let { connection, Schema } = Mongoose;
autoIncrement.initialize(connection);
const pointSchema = new Schema({
type: {
type: String,
enum: ["Point"],
required: true,
},
coordinates: {
type: [Number],
required: true,
},
});
const UserSchema = new Schema({
firstName: {
type: String,
min: 2,
default: "",
},
lastName: { type: String, default: "" },
email: { type: String, unique: true },
address: { type: String, default: "" },
password: { type: String, default: "" },
ipInfo: {
ip: { type: String, default: "" },
range: { type: Array, default: [] },
country: { type: String, default: "" },
region: { type: String, default: "" },
eu: { type: String, default: "" },
city: { type: String, default: "" },
ll: { type: Array },
metro: Number,
area: Number,
},
lastLocation: {
type: pointSchema,
default: {
type: "Point",
coordinates: [0, 0],
},
index: "2dsphere",
},
});
UserSchema.plugin(autoIncrement.plugin, {
startAt: 1,
incrementBy: 1,
model: "User",
});
export const User = Mongoose.model("User", UserSchema);
우리가 위에서 한 것은 새로운 필드를 위해 사용자 모델을 업데이트하는 것입니다. 이 필드들은 ipInfo와 사용자의 마지막 위치를 데이터베이스에 저장할 수 있도록 합니다.사용자가 http 요청을 보내는 위치를 설치하고 설정하며 express ip를 사용합니다.
이 패키지는 사용자가 요청한 경도와 위도, 그리고 도시, 시간대, 국가 등 세부 사항을 사용자의 IP 주소에 따라 발견할 수 있도록 합니다.
yarn add express-ip
내부에 새 코드 src/app를 추가합니다.회사 명//to the upper part before app.get("/")
import { User } from "./models/User.model";
import expressIP from "express-ip";
app.use(expressIP().getIpInfoMiddleware);
//To the lower part before the last line of code add :
app.get("/nearbyusers", async (req, res) => {
try {
const { ipInfo } = req;
let nearByUsers = await User.find({
lastLocation: {
$nearSphere: {
$geometry: {
type: "Point",
coordinates: ipInfo.ll,
},
$maxDistance: 10000,
},
},
});
if (!nearByUsers || nearByUsers.length === 0) {
res.status(201).json({
message: "No users near you",
nearByUser: [],
});
} else {
res.status(201).json({
message: "Here are users near you",
nearByUsers,
});
}
} catch (err) {
res.status(400).json({
message: `Issues finding nearby users. ${err.message}`,
});
}
});
express ip 패키지를 가져오고 프로그램의 모든 경로에서 사용할 수 있도록 설정하는 것입니다.그리고 루트를 써서 기본적으로 호출자의 ip Info를 검사한 다음에 10킬로미터의 거리에 따라 그들에게 사용자 그룹을 보낸다.사용자 상세 정보를 얻기 위해 auth 컨트롤러에 새 루트 추가
이 루트를 사용하고자 하는 목적은 사용자가 지난번에 요청한 마지막 위치와 IP 상세한 정보를 업데이트하는 것입니다.
src/controllers/major/auth.컨트롤러.회사 명
import { createUser, loginUser } from "../utils/User.util";
import { handleResError, handleResSuccess } from "../utils/response.util";
import JWT from "jsonwebtoken";
import dotenv from "dotenv";
dotenv.config();
const { secretKey } = process.env;
export const SignupController = async (req, res) => {
try {
let userDetails = req.body;
let { err, user } = await createUser(userDetails);
if (err) handleResError(res, err, 400);
else {
let { _id, email, isActive } = user;
let options = {
expiresIn: "12h",
issuer: "nearby-hasher",
};
let token = await JWT.sign({ _id, email, isActive }, secretKey, options);
handleResSuccess(res, `Account created!`, token, 201);
}
} catch (err) {
handleResError(res, err, 400);
}
};
export const LoginController = async (req, res) => {
try {
let { err, token } = await loginUser(req.body);
if (err) handleResError(res, err, 400);
else handleResSuccess(res, "login successful", token, 201);
} catch (err) {
handleResError(res, err, 400);
}
};
export const FetchAUserController = async (req, res) => {
try {
console.log(req.decoded);
const { ipInfo } = req;
let id = req.decoded._id;
let updatedUser = await UpdateLastLocation(ipInfo, id);
handleResSuccess(res, "user fetched", updatedUser, 201);
} catch (err) {
handleResError(res, err, 400);
}
};
기본적으로 우리의 updateLastLocation 함수를 호출하여 사용자의 id와 ip Info를 제공하여 사용자의 위치 상세한 정보를 데이터베이스에 저장하도록 합니다.사용자 가져오기 라우팅 테스트
인증 영패를 권한 수여 헤더로 요청에 추가해야 합니다. 아래의 화면 캡처와 같습니다.따라서 사용자의 ipInfo는 데이터베이스에 저장할 수 있습니다
등록/로그인 시 사용자 위치 업데이트
src/controllers/majors/auth.컨트롤러.회사 명
import { createUser, loginUser } from "../utils/User.util";
import { handleResError, handleResSuccess } from "../utils/response.util";
import JWT from "jsonwebtoken";
import { User } from "../../models/User.model";
import dotenv from "dotenv";
import { UpdateLastLocation } from "../utils/updateLastLocation";
dotenv.config();
const { secretKey } = process.env;
export const SignupController = async (req, res) => {
try {
let userDetails = req.body;
let ipInfo = { req };
let { err, user } = await createUser(userDetails);
if (err) handleResError(res, err, 400);
else {
let { _id, email, isActive } = user;
await UpdateLastLocation(ipInfo, _id);
let options = {
expiresIn: "12h",
issuer: "nearby-hasher",
};
let token = await JWT.sign({ _id, email, isActive }, secretKey, options);
handleResSuccess(res, `Account created!`, token, 201);
}
} catch (err) {
handleResError(res, err, 400);
}
};
export const LoginController = async (req, res) => {
try {
let ipInfo = { req };
let { err, token } = await loginUser(req.body);
let user = await User.findOne({ email: req.body.email });
await UpdateLastLocation(ipInfo, user._id);
if (err) handleResError(res, err, 400);
else handleResSuccess(res, "login successful", token, 201);
} catch (err) {
handleResError(res, err, 400);
}
};
export const FetchAUserController = async (req, res) => {
try {
console.log(req.decoded);
const { ipInfo } = req;
let id = req.decoded._id;
let updatedUser = await UpdateLastLocation(ipInfo, id);
handleResSuccess(res, "user fetched", updatedUser, 201);
} catch (err) {
handleResError(res, err, 400);
}
};
시작 스크립트를 패키지에 추가합니다.json은 응용 프로그램을 heroku로 전송합니다. 왜냐하면nearbyusers 루트의 실시간 테스트는 실시간 서버에서 진행해야 하기 때문입니다.소포json
"start": "node -r esm ./src/server.js"
heroku로 밀어주세요.heroku create
git add .
git commit -m 'heroku push
git push heroku master || git push heroku main
git-push-heroku-main을 추가한 이유는 최근의 Github-repo 생성에서master가main으로 이름이 바뀌었기 때문입니다.Postman Documentation의 문서를 참조하십시오.
이것은 나의 첫 번째 강좌입니다. 평론 부분에서 평론이 개선되어야 할 부분을 설명해 주십시오.
Reference
이 문제에 관하여(Nodejsapi에서 주변 사용자를 찾을 수 있는 지리적 인코딩 기능 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/boyepanthera/build-a-geocoding-feature-for-finding-users-around-in-nodejs-api-4mg0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)