Настройка MongoDB в Deno
Deno - это простая и безопасная среда выполнения для JavaScript, которая по умолчанию поддерживает и настраивает TypeScript. MongoDB - это кроссплатформенная программа базы данных, ориентированная на документы, которая широко используется разработчиками. В этой статье мы узнаем, как интегрировать MongoDB в наше приложение Deno.
Предпосылки
- Знакомство с TypeScript
- VS Code или любой редактор кода, установленный на вашем компьютере.
- Базовые знания MongoDB.
- POSTMAN установлен на локальной машине.
Прежде чем мы начнем, убедитесь, что на вашем локальном компьютере установлен Deno. Если вы используете Mac и еще не установили его, откройте терминал и выполните эту команду:
brew install deno
Если вы используете компьютер Windows, вы можете установить его, выполнив эту команду на своем терминале:
iwr https://deno.land/x/install/install.ps1 -useb | iex
Или, если у вас установлен Chocolatey, вы можете запустить:
choco install deno
Приступим
Мы начнем с создания файла server.js
, а затем настроим наш сервер Deno. Поскольку нет файла package.json
, как в Node.js, Deno использует ссылки на модули по URL-адресам или путям к файлам.
import { Application, Router } from "https://deno.land/x/oak/mod.ts";
const app = new Application();
const router = new Router();
const PORT = 3000;
router
.get("/", (ctx) => {
ctx.response.body = "This is the home route";
});
app.use(router.routes());
app.use(router.allowedMethods());
app.listen({ port: PORT });
Мы используем Oak для запуска нашего сервера. Oak - это среда промежуточного программного обеспечения Deno для HTTP-серверов, которая также включает промежуточное программное обеспечение маршрутизатора.
Теперь мы можем запустить на нашем терминале команду node run --allow-net server.ts
для обслуживания нашего приложения. Из-за безопасности Deno нам нужно добавить --allow-net
для запуска сервера. Мы можем найти приложение в нашем браузере на localhost:8000
.
Теперь, когда наш сервер запущен и работает, мы можем приступить к настройке MongoDB в нашем приложении. Создайте файл db.js
, в котором мы будем настраивать нашу конфигурацию БД:
// import the package from url
import { init, MongoClient } from "https://deno.land/x/mongo@v0.12.1/mod.ts";
// Intialize the plugin
await init();
// Create client
const client = new MongoClient();
// Connect to mongodb
client.connectWithUri("mongodb://localhost:27017");
// Give your database a name
const dbname: string = "denoMongoApp";
const db = client.database(dbname);
// Declare the mongodb collections here. Here we are using only one collection (i.e user).
// Defining schema interface
interface UserSchema {
_id: { $oid: string };
name: string;
email: string;
phone: string;
}
const User = db.collection<UserSchema>("user");
export { db, User };
Здесь мы импортируем плагин, а затем инициализируем его. Мы создаем экземпляр mongoClient
, а затем подключаем его к MongoDB. Мы создали коллекцию User
, которую будем использовать для тестирования нашей конфигурации Mongo. Мы также определяем интерфейс TypeScript для модели MongoDB, который будет принимать имя, адрес электронной почты, телефон и сгенерированный Mongo ID.
Теперь, когда это настроено, мы создадим простое приложение CRUD для его тестирования. Чтобы сделать наше приложение более масштабируемым, нам нужно создать файлы routes.ts
и controller.ts
. Наш файл routes.ts
будет обрабатывать наши маршруты, а файл controller.ts
будет обрабатывать нашу логику MongoDB.
Наш файл routes.ts
должен выглядеть так:
import { Router } from "https://deno.land/x/oak/mod.ts";
import { getUsers, createUser } from "./controller.ts";
const router = new Router();
router
.get("/", (ctx) => {
ctx.response.body = "This is the home route";
})
.get("/get-users", getUsers)
.post("/create-user", createUser);
export default router;
В этой новой конфигурации нам нужно изменить наш файл server.ts
:
import { Application } from "https://deno.land/x/oak/mod.ts";
const app = new Application();
import router from "./routes.ts";
const PORT: number = 3000;
//
app.use(router.routes());
app.use(router.allowedMethods());
app.listen({ port: PORT });
Теперь нам нужно определить наши методы маршрутизации, которые мы вызвали в файле router.ts
. Начнем с создания метода getUser
. Помните, что мы должны добавить экземпляр нашей базы данных, который мы создали в файле db.ts
:
import { User } from "./db.ts";
let getUsers = async (ctx: any) => {
try {
const data: any = await User.find();
ctx.response.body = { "status": true, data: data };
ctx.response.status = 200;
} catch (err) {
ctx.response.body = { status: false, data: null };
ctx.response.status = 500;
console.log(err);
}
};
Теперь мы можем вызвать конечную точку get-user
, которая по умолчанию вернет пустой массив со статусом 200
.
Мы воспользуемся той же техникой для реализации метода createUser
:
let createUser = async (ctx: any) => {
try {
let body: any = await ctx.request.body();
console.log(await body.value);
const { name, phone, email } = await body.value;
const id = await User.insertOne({
name: name,
phone: phone,
email: email,
});
ctx.response.body = { status: true, data: id };
ctx.response.status = 201;
} catch (err) {
ctx.response.body = { status: false, data: null };
ctx.response.status = 500;
console.log(err);
}
};
Всегда не забывайте ждать body.value
, так как это асинхронный запрос. Без этого он просто вернет идентификатор объекта.
Запустим приложение:
deno run --allow-all --unstable server.ts
Флаг --allow-all
разрешит все разрешения и отключит безопасность Deno в нашем приложении.
Тестирование наших конечных точек
Давайте продолжим и протестируем наши конечные точки с помощью POSTMAN. Вот тест на получение пользователей:
А вот и тест на создание пользователя:
Вывод
Настройка приложения в Deno - довольно проста и безопасна. Вы можете использовать любую базу данных по вашему выбору, пока для нее есть контроллер Denon. Из-за того, что у Deno нет файла package.json, он кэширует все модули на нашей локальной машине, что намного быстрее.