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

Как создать свое собственное приложение Uber-for-X

Избранные в топ-десять часов Mybridge’s Top Nodejs с октября 2016 года и Top Ten Nodejs статей года (V.2017) обновления: отъездная версия на моем технологическом блоге! Эта статья сейчас несколько лет – и благодаря быстро меняющейся экосистеме JavaScript статья стала

Автор оригинала: FreeCodeCamp Community Member.

Извлеченный в MyBridge ‘s Top Ten Nodejs Статьи с октября 2016 и Top Ten Nodejs Статьи года (v.2017)

Обновление: отъезд последней версии на моем Технический блог ! Эта статья сейчас несколько лет – и благодаря быстро меняющейся экосистеме JavaScript статья стала слегка устаревшей. Нажмите на вышеуказанную ссылку для обновленной версии этой статьи и проекта.

Uber (если вы не слышали об этом) – это удобное приложение, которое позволяет вам поймать кабину, не проходя вокруг, чтобы искать один. И самое главное, это решает проблемы спроса и предложения, которые существуют среди драйверов такси и ищущих кабины.

Сегодня существует множество стартапов, ориентированных на Uber-for-X Программы. Мышление идет, что сделал Uber для такси для такси, они, безусловно, могут сделать для других проблем поставок/требований.

Так во время халака, я и мой Друг Решил построить приложение гражданина-КС. Мы подумали, что было бы здорово построить что-то, что может помочь своим друзьям во времена проблемы!

После некоторого мышления это были следующие особенности, которые мы согласились:

  1. Цервицы смогут просить ближайшего сотрудника полиции в своем районе в прессе кнопки. Это повысит «сигнал бедствия» и предупреждает соседние полицейские.
  2. Любая полиция в окрестностях сразу получит местоположение пользователя и может принять запрос и решить проблему.
  3. Система рейтинга
  4. Данные, собранные из местоположения, дел преступности, решенные и т. Д. Могут быть визуализированы на карте или рисуться с некоторыми другими классными виджетами интерфейса пользовательского интерфейса

В этом руководстве я буду проходить вас через то, как мы построили его пошаговые, так что вы сможете построить свой собственный Uber-for-X приложение.

Прежде чем начать, это бы помнить бы следующие моменты –

  • В этом руководстве не будет сосредоточиться на том, как построить приложение для масштаба. Или для производительности. Он в основном спроектирован так, чтобы вы могли повеселиться, создавая его, и как вы можете создать что-то, что имитирует Uber. Подумайте об этом, как будто построение минимального жизнеспособного продукта, чтобы продемонстрировать свою идею или запуск, для доказательства концепции.
  • Поскольку я не работал на приложениях Android или iPhone, я буду строить это, чтобы работать внутри браузера.

Теперь каждое приложение, которое вы строите, имеет мало важных штук:

  • приложение для клиента (которое вы видите в браузере или на экранах телефона)
  • на заднем конце, веб-сервер для обработки входящих запросов от клиента и на маршрут информации
  • и база данных для хранения и запроса информации.

На заднем конце вы будете использовать MongoDB в качестве базы данных. Проще учиться, и предлагает много методов запросов для обработки геопространственной информации, которая вам понадобится для вашего приложения.

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

На переднем конце вы будете использовать HTML5, CSS3, JavaScript, а также карты Google и API.

Я предполагаю, что у вас уже есть знания JavaScript, и что у вас есть хотя бы теоретическое понимание того, как работают Nodejs и MongoDB.

Вот содержимое этого руководства:

Часть 1 (что вы сейчас читаете) :

  • Дизайн схемы Mongodb
  • Использование оболочки Mongo для запроса информации
  • Подключение базы данных с помощью сервера USDE-Express и запись RESTFLAY API

Часть 2 :

  • Использование Socket.IO, чтобы включить КС и гражданские устройства, разговаривают друг с другом
  • Использование Google Maps API, чтобы показать гражданские лица и полицейские на карте

Давайте начнем!

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

Я лично люблю mongodb, потому что это позволяет быстро построить прототипы для идеи продемонстрировать доказательство концепции.

Прежде чем начать, убедитесь, что у вас установлены MongoDB и NODEJS. На момент написания этой статьи текущая версия MongoDB является 3.2 Отказ

Проектирование схемы

Поскольку вы используете Mongodb, все, что вы экономите в нем, – это коллекция документов.

Давайте создадим собрание под названием Граждандата Для хранения информации о гражданстве, а другая коллекция называется Polictata Для хранения информации полицейских. Так что идите вперед, откройте свой терминал и введите Монго Чтобы уволить оболочку Монго. Как только он открывается, вы можете показать существующие базы данных в Mongodb, набрав:

show dbs

Вам нужна новая база данных для хранения данных вашего приложения. Давайте назовем это MyuberApp. Чтобы создать новую базу данных, вы можете ввести:

use myUberApp

использовать Команда имеет эффект создания новой базы данных, если оно не существует. Если это делает, он говорит Mongo применить все следующие команды в эту базу данных.

Mongo хранит документы в Коллекции Отказ Коллекции похожи на таблицы. Чтобы увидеть существующие коллекции, введите:

show collections

Для полицейского имени пользователя также может быть значком. Вы можете добавить в поле для адреса электронной почты и один для пароля тоже (который не будет раскрыт) для целей аутентификации.

Перейти к этому ссылка И сохраните набор данных JSON для информации, связанной с COP.

Чтобы импортировать данные из этого файла JSON, введите это в свой терминал:

mongoimport --db myUberApp --collection policeData --drop --file ./path/to/jsonfile.json

Теперь, прежде чем начать запрашивать вашу базу данных, вам нужно немного узнать о том, как Индексы в MongoDB (или любой базе данных для этого) работают.

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

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

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

Но другие виды запросов становятся возможными. Например, извлечь информацию студентов, чьи высоты лгут от 4 до 5 футов. В каком случае Тирион Информация может быть восстановлена быстро, потому что:

Различные базы данных поддерживают различные типы индексов. Вы можете прочитать в полном списке индексов, поддерживающих MongoDB здесь Отказ

Итак, теперь, если вы вводите эту команду:

 db.policeData.find().pretty()

который вернет вас все документы, которые существуют внутри Polictata Коллекция – это весь список полицейских. (Функция Beautio облегчает чтение продукта).

Если вы хотите получить информацию о конкретном полицейском, чей UserID это 01 Вы можете набрать db.policeData.find ({userid: "01"}). Довольно ()

{
    "_id" : ObjectId("57e75af5eb1b8edc94406943"),
    "userId" : "01",
    "displayName" : "Cop 1",
    "phone" : "01",
    "email" : "cop01@gmail.com",
    "earnedRatings" : 21,
    "totalRatings" : 25,
    "location" : {
        "type" : "Point",
        "address" : "Kalyan Nagar, Bengaluru, Karnataka 560043, India",
        "coordinates" : [
            77.63997110000003,
            13.0280047
        ]
    }
}

Использование геопространственных индексов MongoDB

Геопространственные индексы позволяют вам хранить Геойсон объекты в документах.

Объекты Geojson могут быть разных Типы , например Point, LineSting и Многоугольник.

Если вы соблюдаете вывод вашего .find () Команда, вы заметите, что каждый Расположение это объект, который имеет Тип поле и координаты поле внутри него. Это важно, потому что если вы храните свой объект Geojson как Точка Тип, вы можете использовать $ рядом Команда для запроса для точек в пределах определенной близости для данной долготы и широты.

Чтобы использовать это, вам нужно создать 2dsphere индекс (который является геопространственным индексом) на Расположение поле, а есть Тип поле внутри него. 2dsphere Индекс поддерживает запросы, которые рассчитывают геометрии на земной сфере. Это включает в себя геопространственные запросы Mongodb: запросы для включения, пересечения и близость.

Так что введите это в вашу оболочку Mongo:

db.policeData.createIndex({"location": "2dsphere"})

Теперь, чтобы получить документы с ближайшего к дальнейшему от заданной пары координат, вам необходимо выдать команду с этим синтаксисом:

db..find({
    : {
        $near: {
            $geometry: {
                type: "Point",
                coordinates: [, ]
            },
            $minDistance: ,
            $maxDistance: 
        }
    }
}).pretty()

$ Mindistance и $ maxdistance – это дополнительные поля. Теперь, чтобы получить все полицейские, которые расположены в течение 2 километров от широта 12.9718915 и долгота 77.64115449999997, Запустите это:

db.policeData.find({
    location: {
        $near: {
            $geometry: {
                type: "Point",
                coordinates: [77.64115449999997, 12.9718915]
            },
            $maxDistance: 2000
        }
    }
}).pretty()

И вот и это – вы найдете список документов, возвращаемых на выходе!

Идеально! Теперь давайте попробуем делать то же самое с веб-сервером. Скачайте это Package.json Файл и сохраните его в корне папки проекта (убедитесь, что вы назвали его Package.json ), а затем в вашем терминале CD в каталог, который содержит файл и запустить

sudo npm install

Краткое объяснение некоторых пакетов, которые вы собираетесь использовать:

  • Экспресс это веб-каркас для Nodejs. У него есть много API, коммунальных услуг и подразгоний в экосистеме, чтобы помочь вам построить ваше приложение.
  • Тело-парсер Персидные телы входящих запросов в промежуточное освещение перед вашими обработчиками, доступными под req .body имущество. Вам нужно это, так что вы можете обрабатывать почтовые запросы.
  • подчеркивание делает написание JavaScript проще. Не стесняйтесь использовать другую библиотеку, если вы предпочитаете.
  • Socket.io Позволяет использовать веб-сокеты в вашем приложении узла.
  • Монгодб является официальным водителем Nodejs для Mongodb. Это помогает вашему узлу приложению разговаривать с вашей базой данных.

Файл Package.json также содержит другие модули. Вам понадобится их во время создания полного приложения, но я сосредоточусь на том, как использовать Монгодб Водитель в вашем приложении Express для выполнения запросов. Вот что делают некоторые другие модули:

  • async это утилита для борьбы с асинхронным кодом в Nodejs. Это поможет вам избежать обратного вызова ада.
  • Отладка это отладчная библиотека. Этот удобный инструмент помогает отлаживать свои программы без использования уродливых console.log выписки выводы.
  • Redis похож на Монгодб Водитель. Это позволяет вашему приложению Nodejs разговаривать с вашей базой данных Redis.
  • Connect-Redis это сеансный магазин, который использует Redis для управления сессиями. Вам понадобится позже, когда вы решите иметь учетные записи пользователей.

Прежде чем писать код, это будет полезно организовать его первым. На данный момент вы можете использовать два файла:

  • Файл для записи конечных точек API
  • Файл, который использует драйверы базы данных для операций, связанных с базой данных. Обработчик маршрута решит, какая функция вызова из файла базы данных. После того, как запрос выполняется, результаты возвращаются обратно в свой обработчик маршрута с помощью функции обратного вызова.

Давайте посмотрим, как это выглядит, когда вы пишете свой код:

var http = require("http");
var express = require("express");
var consolidate = require("consolidate");//1
var _ = require("underscore");
var bodyParser = require('body-parser');

var routes = require('./routes'); //File that contains our endpoints
var mongoClient = require("mongodb").MongoClient;

var app = express();
app.use(bodyParser.urlencoded({
   extended: true,
}));
             
app.use(bodyParser.json({limit: '5mb'}));

app.set('views', 'views'); //Set the folder-name from where you serve the html page. 
app.use(express.static('./public')); //setting the folder name (public) where all the static files like css, js, images etc are made available

app.set('view engine','html');
app.engine('html',consolidate.underscore);
var portNumber = 8000; //for locahost:8000

http.createServer(app).listen(portNumber, function(){ //creating the server which is listening to the port number:8000, and calls a function within in which calls the initialize(app) function in the router module
	console.log('Server listening at port '+ portNumber);
	
	var url = 'mongodb://localhost:27017/myUberApp';
	mongoClient.connect(url, function(err, db) { //a connection with the mongodb is established here.
		console.log("Connected to Database");
		routes.initialize(app, db); //function defined in routes.js which is exported to be accessed by other modules
	});
});

/* 1. Not all the template engines work uniformly with express, hence this library in js, (consolidate), is used to make the template engines work uniformly. Altough it doesn't have any 
modules of its own and any template engine to be used should be seprately installed!*/

В этом примере вы создаете новый экземпляр Mongoclient объект из Монгодб модуль. Как только веб-сервер начинается, вы подключаетесь к базе данных MongoDB, используя соединить Функция, которая выставлена вашим Mongoclient пример. После того, как он инициализирует соединение, он возвращает ДБ экземпляр в обратном вызове.

Теперь вы можете пройти как приложение и дБ экземпляры для Инициализировать Функция вашего Маршруты.js файл.

Далее необходимо создать новый файл под названием Маршруты.js и добавьте этот код:

function initialize(app, db) { 
    //A GET request to /cops should return back the nearest cops in the vicinity.
    app.get('/cops', function(req, res){
    /*extract the latitude and longitude info from the request. Then, fetch the nearest cops using MongoDB's geospatial queries and return it back to the client.
    */
    });
}
exports.initialize = initialize;

Для этого вам будет работать, вам придется пройти координаты в качестве строк запроса в ваш запрос. Вы также напишите операции в базе данных в другом файле. Так что идите вперед и создайте новый файл db-options.js, И напишите это:

function fetchNearestCops(db, coordinates, callback) {
    db.collection('policeData').createIndex({
        "location": "2dsphere"
    }, function() {
        db.collection("policeData").find({
            location: {
                $near: {
                    $geometry: {
                        type: "Point",
                        coordinates: coordinates
                    },
                    $maxDistance: 2000
                }
            }
        }).toArray(function(err, results) {
            if(err) {
                console.log(err)
            }else {
                callback(results);
            }
        });
    });
}
exports.fetchNearestCops = fetchNearestCops;

Эта функция принимает три аргумента: экземпляр дБ , массив, который содержит координаты в порядке [, ] и функцию обратного вызова, к которой он возвращает результаты вашего запроса.

createindex Обеспечивает, что индекс создан на указанном поле, если оно не существует, поэтому вы можете пропустить, что если вы уже создали индекс до запроса.

Теперь все, что осталось сделать, это вызвать эту функцию внутри вашего обработчика. Итак, измените свой Маршруты.js Код к этому:

var dbOperations = require('./db-operations');
function initialize(app, db) {
    // '/cops?lat=12.9718915&&lng=77.64115449999997'
    app.get('/cops', function(req, res){
        //Convert the query strings into Numbers
        var latitude = Number(req.query.lat);
        var longitude = Number(req.query.lng);
        dbOperations.fetchNearestCops(db, [longitude,latitude], function(results){
        //return the results back to the client in the form of JSON
            res.json({
                cops: results
            });
        });  
    });
}
exports.initialize = initialize;

Вот и все! Запустить

node app.js 

От вашего терминала, затем откройте свой браузер и нажмите http://localhost: 8000/cops? lat = 12.9718915 && lng = 77.6411544999997

В зависимости от строк запросов, вы должны либо получить ответ JSON, содержащий пустой массив, либо массив, содержащий данные COP!

Это конец части 1. в Часть 2 , вы возьмете его на выемку и попытаетесь отправить сигнал бедствия в близлежащие полицейские. Затем вы выясните, как полицейский может ответить на сигнал с помощью Socket.IO. Вы также увидите, как отобразить местонахождение гражданина на карте.

Тем временем посмотрите на Исходный код На Github!

Если вам понравилась эта статья, пожалуйста, подумайте о поддержке меня на Патреоне.

Стать покровителем!

Вы должны полностью подписаться. Я не буду тратить ваше время.

Большое спасибо Куинси Ларсон Для того, чтобы помочь мне сделать эту статью лучше.

Вы можете прочитать эту статью и последующие части в моем блог тоже!