Рубрики
Без рубрики

Создайте функцию геокодирования для поиска пользователей в Nodejs API

Сообщение, объясняющее, как построить функцию поиска пользователей в API узла, отслеживание IP-адреса пользователя и обновляя их в вашу БД.

Автор оригинала: Olanrewaju Olaboye.

В последнее время это казалось, что приложения в социальных сетях могут показать вам пользователей, которые они верят, живут вокруг вас, и вы, возможно, могут захотеть общаться. Как разработчик в один момент времени вам нужно будет отслеживать местоположение пользователей и рекомендовать людей, которые они могут знать, чтобы установить другую связь/сеть.

В этом руководстве я собираюсь показывать нам точно, как отслеживать последнее местоположение пользователя, сохранить/обновить это в нашей базе данных и использовать этот резервуар данных для рекомендации пользователей для каждого пользователя на платформе.

Предпосылки

  1. Базовые знания Nodejs, Express Framework и Mongoose Orm
  2. Знание Token Auth Auth использует JWT в Nodejs

Гид

  1. Клон и проверьте код котельной
  2. Написать схему MongoDB/Mongoose с 2DSphere Index.
  3. Установите, настроить и используйте Express-IP, чтобы схватить пользователей местоположения сделали HTTP-запрос от.
  4. Запросите пользовательскую модель для других пользователей вокруг конкретного пользователя.

Клон и проверьте код котельной

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 через почтальон

Alt Text.

Сделайте образец запроса в систему на свой API через почтальон

Alt Text.

Написать схему 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 пользователя может быть сохранено в БД

Alt Text.

Обновить местоположение пользователя в регистрации/входа 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"

Подтолкнуть к Героку

  1. Убедитесь, что у вас есть Heroku Cli Logugedin
  2. Убедитесь, что вы добавите строку подключения базы данных Live MongoDB
  3. Введите следующие команды один за другим на вашем терминале.

Вы можете сравнить свою работу с моим Окончательное репо

heroku create 
git add .
git commit -m 'heroku push
git push heroku master || git push heroku main

Причина добавления Git Push Heroku Main заключается в том, что Master теперь переименован в качестве главного создания GitHub Repo.

Посетите документацию на Документация почтальона

  1. Создайте два пользователя в Live API с разными электронными письмами
  2. Позвоните в маршрут для пользователя
  3. Затем на другом браузере посетите Ливиоп

Он покажет вам два пользователя, которые вы создали, потому что они живут вокруг вас.

Это мое первое учебное пособие, прокомментируйте вещи, чтобы улучшить в разделе «Комментарий».