Автор оригинала: Olanrewaju Olaboye.
В последнее время это казалось, что приложения в социальных сетях могут показать вам пользователей, которые они верят, живут вокруг вас, и вы, возможно, могут захотеть общаться. Как разработчик в один момент времени вам нужно будет отслеживать местоположение пользователей и рекомендовать людей, которые они могут знать, чтобы установить другую связь/сеть.
В этом руководстве я собираюсь показывать нам точно, как отслеживать последнее местоположение пользователя, сохранить/обновить это в нашей базе данных и использовать этот резервуар данных для рекомендации пользователей для каждого пользователя на платформе.
Предпосылки
- Базовые знания Nodejs, Express Framework и Mongoose Orm
- Знание Token Auth Auth использует JWT в Nodejs
Гид
- Клон и проверьте код котельной
- Написать схему MongoDB/Mongoose с 2DSphere Index.
- Установите, настроить и используйте Express-IP, чтобы схватить пользователей местоположения сделали HTTP-запрос от.
- Запросите пользовательскую модель для других пользователей вокруг конкретного пользователя.
Клон и проверьте код котельной
1. git clone https://github.com/WonderfulOlanrewaju/nearby-api-boilerplate.git 2. cd /nearby-api-boilerplate 3. yarn install && yarn add cross-env
Три команда выше, команда одного клона удаленного репо в ваш текущий рабочий каталог. Команда двумя изменениями изменения в скопированной папке, когда дерево команды Установите все зависимости, необходимые для запуска кода Boaterplate с регистрацией и входом в систему с JWT уже сделано.
Создайте файл .env в корне вашего проекта и добавьте переменную среды
secretKey = yoursecretkeyvalue
Сделайте образец запроса регистра к вашему API через почтальон
Сделайте образец запроса в систему на свой API через почтальон
Написать схему MongoDB/Mongoose с 2DSphere Index.
Создать файл: SRC/Контроллеры/Utils/updatelocation.js
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; };
Это полезная функция, которая будет использоваться на любом маршруте, которую мы хотим отслеживать местоположение пользователя, чтобы извлечь их значение и широту и сохранить его в несколько полей в объекте пользователя из БД.
Следующим шагом является обновление нашей модели пользователя, чтобы позволить нам сохранить IPINFO и LastLocation пользователя в БД.
Создать файл SRC/Models/user.model.js
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 и последнее местоположение пользователей в БД.
Установите, настроить и используйте Express-IP, чтобы схватить пользователей местоположения сделали HTTP-запрос от.
Что позволяет нам сделать пакет, это обнаружить долготу и широту, которую пользователь сделал запрос наряду с некоторыми другими деталями, такими как город, часовой пояс и страна на основе их IP-адреса.
yarn add express-ip
Внутри Добавить новые коды SRC/App.js
//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 и настроить его, чтобы быть доступным на всех маршрутах нашего приложения. И напишите маршрут, который в основном проверяет IPINFO человека, который призывает его, отправьте им массив пользователей на основе близости 10 км.
Добавьте новый маршрут к вашему контроллеру авторизации для получения подробности пользователей То, что мы хотим использовать этот маршрут, – это обновить последнее местоположение и детали IP, где пользователь сделал свой последний запрос от.
SRC/Контроллеры/Майор/auth.controller.js
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); } };
Что сделано, в основном вызывает нашу функцию UpdateLastlocationLocation, поставляйте его идентификатор и IPINFO пользователя, чтобы это сохранило информацию о местоположении пользователя в БД.
Проверьте маршрут пользователя для пользователя Убедитесь, что токен авторизации в качестве заголовка авторизации на запрос, как на скриншоте ниже. Таким образом, IPINFO пользователя может быть сохранено в БД
Обновить местоположение пользователя в регистрации/входа SRC/Контроллеры/Majors/auth.controller.js
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); } };
Добавить Start Script в Package.json и нажмите приложение к Heroku, потому что живое тестирование маршрута ближайших продавцов должно быть на живом сервере
Package.json.
"start": "node -r esm ./src/server.js"
Подтолкнуть к Героку
- Убедитесь, что у вас есть Heroku Cli Logugedin
- Убедитесь, что вы добавите строку подключения базы данных Live MongoDB
- Введите следующие команды один за другим на вашем терминале.
Вы можете сравнить свою работу с моим Окончательное репо
heroku create git add . git commit -m 'heroku push git push heroku master || git push heroku main
Причина добавления Git Push Heroku Main заключается в том, что Master теперь переименован в качестве главного создания GitHub Repo.
Посетите документацию на Документация почтальона
- Создайте два пользователя в Live API с разными электронными письмами
- Позвоните в маршрут для пользователя
- Затем на другом браузере посетите Ливиоп
Он покажет вам два пользователя, которые вы создали, потому что они живут вокруг вас.
Это мое первое учебное пособие, прокомментируйте вещи, чтобы улучшить в разделе «Комментарий».