Автор оригинала: FreeCodeCamp Community Member.
по куполам Скотта
Node.js может быть пугающим для начинающих. Но его гибкая структура и отсутствие строгих руководящих принципов кажутся более сложными, чем оно.
В этом руководстве является быстрым и простым руководством по Node.js, экспресс-структуру и MongoDB, ориентируясь на фундаментальные маршруты отдыха и базовым взаимодействием базы данных. Вы построете простой котел API, который затем можно использовать в качестве основы для любого приложения.
Для кого это учебное пособие для : У вас должно быть базовое понимание о отдыхах API и операций CRUD, плюс базовые знания JavaScript. Я использую ES6 (в основном функции Fat-arrow), но ничего не сложного.
Для этого учебника вы создадите скелет заднего конца для применения применения – подумайте Google сохраняет Отказ Вы хотите иметь возможность выполнять все четыре действия Crud на ваших заметках: создайте, читать, обновлять и удалять.
Установка
Если у вас нет установленного узла, Смотрите здесь Отказ
В новом каталоге запустите NPM init и следуйте вместе с подсказками, давая вашему приложению имя «заметного» (или что-то еще, что вы можете).
npm init
Как только это сделано, вы должны иметь Package.json Готов к работе в вашем каталоге. Это означает, что вы можете начать устанавливать зависимости, которые вам нужно для вашего проекта.
Вы собираетесь использовать Express в качестве своей рамки, MongoDB в качестве базы данных и пакет под названием Body-Parser, чтобы помочь справиться с запросами JSON.
npm install --save express mongodb@2.2.16 body-parser
Я также рекомендую установить Nodemon в качестве зависимости разработки. Это простой небольшой пакет, который автоматически перезапускает ваш сервер при изменении файлов.
Если вы запустите:
npm install --save-dev nodemon
Затем вы можете добавить следующий скрипт на Package.json :
// package.json
"scripts": { "dev": "nodemon server.js" },
Ваш полный Package.json должен выглядеть так:
// package.json
{ "name": "notable", "version": "1.0.0", "description": "", "main": "server.js", "scripts": { "dev": "nodemon server.js" }, "author": "", "license": "ISC", "dependencies": { "body-parser": "^1.15.2", "express": "^4.14.0", "mongodb": "^2.2.16" }, "devDependencies": { "nodemon": "^1.11.0" }}
Теперь вы можете создать свой server.js Файл И начните строить вашу API.
Наш сервер
Давайте начнем, требуя всех ваших зависимостей в server.js.
// server.js
const express = require('express');const MongoClient = require('mongodb').MongoClient;const bodyParser = require('body-parser');
const app = express();
Вы собираетесь использовать MongoClient, чтобы взаимодействовать с вашей базой данных. Обратите внимание, что вы также инициализируете свое приложение в качестве экземпляра Express, ваша структура.
Последнее, что вам нужно сделать, чтобы заставить свой сервер вверх и запустить, это сообщить вашему приложению начать слушать Для HTTP-запросов.
Вы можете указать порт и начать прослушивание так:
// server.js
const port = 8000;
app.listen(port, () => { console.log('We are live on ' + port);});
Теперь, если вы запустите NPM запустить dev (или Node Server.js Если вы не установили Nodemon), вы должны увидеть «Мы живем по порту 8000» в терминале.
Ваш сервер живет. Но это не так много. Или что-нибудь, действительно.
Давайте исправить это.
Крудди маршруты
Для этого примера вы хотите построить 4 маршрута; Чтобы создать ноту, чтобы прочитать ваши заметки, чтобы обновить примечание и удалить примечание.
Это даст вам хорошее представление о том, как структурировать практически любой базовый маршрут с узлом.
Требуют тестирование вашего API, вам нужно имитировать запросы на сободу клиента. Для этого вы будете использовать отличное приложение под названием Почтальон Отказ Это позволяет сделать простые HTTP-запросы с пользовательскими органами и параметрами.
Установите почтальон и давайте начнем настроить свои маршруты.
Супер организован
Большинство учебных пособий Node.js (и многие настоящие приложения) поставили все свои маршруты в один большой Маршруты.js файл. Это делает меня немного неудобным. Напротив, разделение ваших файлов в отдельные папки приводит к хорошей читабельности и делает большие приложения более управляемыми.
У вас нет большого приложения, но давайте сделаем это правильно. Сделайте следующие каталоги: a приложение Папка с папкой маршрутов внутри него, с index.js и а note_routes.js файл внутри него.
Другими словами: root> App> маршруты> index.js и note_routes.js.
mkdir appcd appmkdir routescd routestouch index.jstouch note_routes.js
Эти каталоги могут показаться сверху для вашего простого небольшого приложения, но всегда приятно начать с лучших практик.
Ваш первый маршрут
Начнем с C в Crud- создайте. Как бы вы создали записку?
Ну, прежде чем делать это, вы должны построить немного больше инфраструктуры. В Express маршруты обернуты в функцию, которая принимает экземпляр экспресс и база данных в качестве аргументов.
Как это:
// routes/note_routes.js
module.exports = function(app, db) {
};
Затем вы можете экспортировать эту функцию через ваш index.js :
// routes/index.js
const noteRoutes = require('./note_routes');
module.exports = function(app, db) { noteRoutes(app, db); // Other route groups could go here, in the future};
Затем импортируйте его для использования в server.js:
// server.js
const express = require('express');const MongoClient = require('mongodb').MongoClient;const bodyParser = require('body-parser');
const app = express();
const port = 8000;
require('./app/routes')(app, {});app.listen(port, () => { console.log('We are live on ' + port);});
Обратите внимание, что поскольку у вас нет базы данных, но не установлена, вы просто проходите в пустой объекте.
Хорошо, сейчас Вы можете сделать ваш маршрут.
Синтаксис прост:
// note_routes.js
module.exports = function(app, db) { app.post('/notes', (req, res) => { // You'll create your note here. res.send('Hello') });};
Когда приложение получает пост Запрос пути «/Notes», он будет выполнять код внутри обратного вызова в объекте запроса (который содержит параметры или json запроса) и объект ответа (используется для ответа).
Вы можете проверить это, используя Postman, чтобы отправить почтовый запрос на localhost: 8000/Notes.
Хороший! Вы создали свой первый реальный маршрут.
Следующим шагом является добавление некоторых параметров к вашему запросу и обработать их в своем API и, наконец, добавьте в свою базу данных.
Запрос параметров
В Postman Перейдите на вкладку для тела и добавьте несколько пар клавишных значений после выбора X-www-форма-орленкадированный переключатель.
Это добавит данные кодированных форм в ваш запрос, который вы сможете обрабатывать с вашим API.
Теперь в вашем note_routes.js Давайте просто выйти из организма.
// note_routes.js
module.exports = function(app, db) { app.post('/notes', (req, res) => { console.log(req.body) res.send('Hello') });};
Попробуйте отправить запрос почтальона, и вы увидите … undefined.
К сожалению, экспресс не может обрабатывать формы URL-кодировки самостоятельно. Но вы установили этот пакет Body-Parser …
// server.
const express = require('express');const MongoClient = require('mongodb').MongoClient;const bodyParser = require('body-parser');
const app = express();
const port = 8000;
app.use(bodyParser.urlencoded({ extended: true }));
require('./app/routes')(app, {});app.listen(port, () => { console.log('We are live on ' + port);});
Теперь вы должны увидеть тело как объект в терминале.
{ title: 'My Note Title', body: 'What a great note.' }
Последний шаг к вашему предварительному маршруту: настройте базу данных, а затем добавьте свои данные в.
Самый простой способ настроить базу данных Mongo через MLAB : Это бесплатно для наименьшего размера, и довольно быстро настроить.
Как только вы создадите учетную запись и развертывание MongoDB, добавьте пользователя в базу данных с именем пользователя и пароль:
Затем возьмите URL здесь (второй):
А в каталоге конфигурации в корне вашего проекта создайте файл db.js.
mkdir config cd configtouch db.js
Внутри, добавьте URL:
module.exports = { url : YOUR URL HERE};
Не забудьте добавить ваше имя пользователя и пароль (те из пользователя базы данных, а не учетная запись MLAB) в URL. (Если вы совершаете этот проект в Github, обязательно включите файл .gitignore Мне нравится , так что вы не делитесь своим паролем со всеми.)
Теперь в вашем server.js , вы можете использовать Mongoclient для подключения к вашей БД и использовать его для завершения настройки приложения:
// server.js
const express = require('express');const MongoClient = require('mongodb').MongoClient;const bodyParser = require('body-parser');const db = require('./config/db');
const app = express();
const port = 8000;
app.use(bodyParser.urlencoded({ extended: true }));
MongoClient.connect(db.url, (err, database) => { if (err) return console.log(err) require('./app/routes')(app, database);
app.listen(port, () => { console.log('We are live on ' + port); }); })
Если вы используете последнюю версию MongoDB (3.0+), измените его так:
// server.js
const express = require('express');const MongoClient = require('mongodb').MongoClient;const bodyParser = require('body-parser');const db = require('./config/db');
const app = express();
const port = 8000;
app.use(bodyParser.urlencoded({ extended: true }));
MongoClient.connect(db.url, (err, database) => { if (err) return console.log(err) // Make sure you add the database name and not the collection name const database = database.db("note-api") require('./app/routes')(app, database);
app.listen(port, () => { console.log('We are live on ' + port); }); })
(Благодаря Алекс Стрельгер Для исправления для 3.0)
Это последний из вашей инфраструктуры Setup! Это все построение отсюда.
Добавление в вашу базу данных
Mongodb хранит данные в Коллекции – Что именно то, как они звучат. В вашем случае вы хотите хранить свои заметки в коллекции, называемых – вы уже догадались – заметки.
Так как вы проходите в своей базе данных как дБ Аргумент в ваших маршрутах, вы можете получить доступ к нему так:
db.collection('notes')
Создание примечания так же просто, как вызов Вставить В вашей коллекции:
const note = { text: req.body.body, title: req.body.title} db.collection('notes').insert(note, (err, results) => {}
После завершения вставки (или не удалось по какой-либо причине), вы хотите отправить обратно ошибку, либо отправить вновь созданный объект Note. Вот полный note_routes.js:
// note_routes.js
module.exports = function(app, db) { const collection = app.post('/notes', (req, res) => { const note = { text: req.body.body, title: req.body.title }; db.collection('notes').insert(note, (err, result) => { if (err) { res.send({ 'error': 'An error has occurred' }); } else { res.send(result.ops[0]); } }); });};
Попробуйте! Отправить запрос пост-к-www-form-urlencoded post с postman, с Название и Тело Установите под вкладку тела.
Ответ должен выглядеть так:
Если вы войти в MLAB, вы также должны увидеть созданную записку в базе данных.
Ваш прочитанный путь
Теперь вы можете немного подобрать темп.
Скажем, вы хотите вернуть обратно, которую вы только что создали, навигации по localhost: 8000/Notes/{id}. В этом случае это было бы localhost: 8000/Notes/585182bd42ac5b07a9755ea3.
(Если у вас нет идентификатора для одного из ваших заметок, вы можете проверить MLAB или просто создать новый).
Вот что это будет выглядеть в note_routes.js :
// note_routes.js
module.exports = function(app, db) { app.get('/notes/:id', (req, res) => { });
app.post('/notes', (req, res) => { const note = { text: req.body.body, title: req.body.title }; db.collection('notes').insert(note, (err, result) => { if (err) { res.send({ 'error': 'An error has occurred' }); } else { res.send(result.ops[0]); } }); });};
Как и раньше, вы собираетесь вызвать метод в вашей основе базы данных заметки. Здесь это удачно по имени Findone.
// note_routes.js
module.exports = function(app, db) { app.get('/notes/:id', (req, res) => { const details = { '_id':}; db.collection('notes').findOne(details, (err, item) => { if (err) { res.send({'error':'An error has occurred'}); } else { res.send(item); } }); });
app.post('/notes', (req, res) => { const note = { text: req.body.body, title: req.body.title }; db.collection('notes').insert(note, (err, result) => { if (err) { res.send({ 'error': 'An error has occurred' }); } else { res.send(result.ops[0]); } }); });};
Вы можете схватить идентификатор из параметров URL через req.params.id Отказ Однако, если вы попытаетесь просто Plop в строке в <> выше, это не будет работать.
MongoDB требует не только идентификатора, как строка , но как идентификатор объект Или, как они называют это, объектом.
Не волнуйтесь, это простое исправление. Вот полный код:
// note_routes.js
var ObjectID = require('mongodb').ObjectID;
module.exports = function(app, db) { app.get('/notes/:id', (req, res) => { const id = req.params.id; const details = { '_id': new ObjectID(id) }; db.collection('notes').findOne(details, (err, item) => { if (err) { res.send({'error':'An error has occurred'}); } else { res.send(item); } }); });
app.post('/notes', (req, res) => { const note = { text: req.body.body, title: req.body.title }; db.collection('notes').insert(note, (err, result) => { if (err) { res.send({ 'error': 'An error has occurred' }); } else { res.send(result.ops[0]); } }); });};
Попробуйте его с одним из ваших идентификаторов записей, и он должен выглядеть так:
Ваш удаленный маршрут
Удаление объекта на самом деле довольно то же самое, что нахождение объекта. Вы просто используете Удалить функция вместо Findone Отказ Вот полный код. Я подчеркнул, что отличается от вашего получения:
// note_routes.js
// ...
app.delete('/notes/:id', (req, res) => { const id = req.params.id; const details = { '_id': new ObjectID(id) }; db.collection('notes').remove(details, (err, item) => { if (err) { res.send({'error':'An error has occurred'}); } else { res.send('Note ' + id + ' deleted!'); } }); });
// ...
Ваш обновленный маршрут
Последний! Положите в основном гибрид между чтением и созданием. Вы находите объект, затем обновите его соответственно. Если вы удалили свою только заметку, время, чтобы сделать еще один!
Код:
// note_routes.js
// ...
app.put('/notes/:id', (req, res) => { const id = req.params.id; const details = { '_id': new ObjectID(id) }; const note = { text: req.body.body, title: req.body.title }; db.collection('notes').update(details, note, (err, result) => { if (err) { res.send({'error':'An error has occurred'}); } else { res.send(note); } }); });
// ...
Теперь вы можете обновить любой из ваших заметок, например:
Обратите внимание на несовершенство с этим кодом – если вы не предоставите корпус или заголовок, запрос на поставку будет аннулировать эти поля в ноте в базе данных.
Вы можете легко добавить некоторую условную логику для обновления полей только в том случае, если они присутствуют в запросе – я оставил это просто для того, чтобы сохранить его простым.
API завершен
Это оно! У вас есть рабочий узел API с каждой из четырех основных операций CRUD.
Целью этого учебника состояла в том, чтобы дать вам степень знакомства с Express, Node и MongoDB – вы можете использовать ваше простое приложение в качестве запуска для более сложных проектов.
В будущем я буду писать учебники для создания более простых API на разных языках и каркасах. Нажмите кнопку следуйте, если вы заинтересованы!
Если это руководство вам поможет вам, пожалуйста, нажмите зеленое сердце ниже – это много значит. Не стесняйтесь также оставить мне комментарий с любыми отзывами или вопросами.
Спасибо за прочтение!