Статьи

Написание сервиса RESTful с использованием Node, Express и MongoDB

Глядя на популярность Node.js , я подумал об изучении и создании API отдыха, который должен создавать, удалять и извлекать сотрудников из базы данных, и, к счастью, я это сделал.

В этом посте я постараюсь повторить шаги, которые я выполнял при написании, вместе со ссылками.

Предполагая, что Node.js уже установлен в нашей системе, давайте начнем создавать nodejs-rest-api , выполнив следующие шаги:

Шаг 1: Создайте каталог, который будет содержать все файлы, связанные с нашим приложением, для меня это / Users / ArpitAggarwal / nodejs-rest-api и выполните npm init :

1
2
3
$ cd /Users/ArpitAggarwal/
$ mkdir nodejs-rest-api
$ npm init

Указанная выше команда npm init создаст package.json, который поможет нам управлять зависимостями.

Шаг 2: Установите Express как зависимость:

1
2
$ cd /Users/ArpitAggarwal/nodejs-rest-api/
$ npm install --save express

Шаг 3: Создайте точку входа по умолчанию для Node.js, т.е. server.js , в том же каталоге, который мы создали ранее:

1
2
$ cd /Users/ArpitAggarwal/nodejs-rest-api/
$ touch server.js

Скопируйте ниже содержание в server.js :

1
2
3
4
5
6
7
8
const express = require('express');
const app = express();
 
app.listen(9999, function() {
  console.log('Node server listening on 9999')
})
 
app.use(express.static(__dirname + '/public'));

Давайте разберемся, что означает каждая строка.

require — импортировать модули в текущий файл
const express = require (‘express’) — Создает приложение Express.
const app = express () — Является ли объект приложения условно обозначенным приложением Express.
app.listen (9999)запускает сокет UNIX и прослушивает соединения по заданному пути.
app.use (express.static (__dirname + ‘/ public’)) — экспресс-доставка статического содержимого для приложения из каталога «public» в каталоге приложения.

Шаг 4. Создайте index.html в каталоге / Users / ArpitAggarwal / nodejs-rest-api / public следующим образом:

1
2
3
4
$ cd /Users/ArpitAggarwal/nodejs-rest-api/
$ mkdir public
$ cd public
$ touch index.html

Скопируйте ниже содержание в index.html :

1
Hello Node!

Шаг 5: Измените server.js, добавив отображение GET для отображения только что созданного index.html :

1
2
3
app.get('/', function(req, res){
  res.sendFile('/index.html')
});

Шаг 6: Перейдите в каталог / Users / ArpitAggarwal / nodejs-rest-api и запустите приложение, выполнив следующую команду:

1
2
$ cd /Users/ArpitAggarwal/nodejs-rest-api
$ node server.js

Теперь откройте http: // localhost: 9999 / в браузере или выполните команду:

1
curl http://localhost:9999

покажет нам «Hello Node!» как ответ.

Шаг 7: Теперь мы установим MongoDB как зависимость, перемещаясь в каталог / Users / ArpitAggarwal / nodejs-rest-api / :

1
2
$ cd /Users/ArpitAggarwal/nodejs-rest-api/
$ npm install --save mongodb

Шаг 8. Создайте config.js, в котором будут храниться все настраиваемые параметры приложения, такие как имя пользователя, пароль, URL-адреса и т. Д. Это в основном помогает нам указать входные данные для приложения во время выполнения на основе различных сред, в которых мы собираемся запустить приложение:

1
2
$ cd /Users/ArpitAggarwal/nodejs-rest-api/
$ touch config.js

Скопируйте приведенный ниже контент в config.js :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
var config = {};
 
config.mongodb = {};
config.server = {};
 
config.server.port = process.env.WEB_PORT || 9999;
 
config.mongodb.username = process.env.MONGODB_USERNAME || 'arpit';
config.mongodb.password= process.env.MONGODB_PASSWORD || 'xxxx';
config.mongodb.host= process.env.MONGODB_HOST || 'ds047752.mlab.com';
config.mongodb.port = process.env.MONGODB_PORT || 47752;
config.mongodb.databaseName = process.env.MONGODB_NAME || 'my-database';
 
module.exports = config;

Замените свойства своими или экспортируйте из командной строки перед запуском приложения, например:

1
2
3
$ cd /Users/ArpitAggarwal/nodejs-rest-api/
$ export MONGODB_PASSWORD = p@ssword
$ node server.js

Шаг 9: Создайте mongodb.js, где мы определим MongoClient и экспортируем соединение с базой данных, а также объект базы данных, чтобы использовать его без избыточности, определяя в одном месте, следующим образом:

1
2
$ cd /Users/ArpitAggarwal/nodejs-rest-api/
$ touch mongodb.js

Скопируйте содержимое ниже в mongodb.js :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var MongoClient = require( 'mongodb' ).MongoClient;
var util = require('util');
var config = require('./config');
var _db;
 
var uri = util.format('mongodb://%s:%s@%s:%d/%s',
    config.mongodb.username, config.mongodb.password, config.mongodb.host, config.mongodb.port, config.mongodb.databaseName);
 
module.exports = {
  connectToServer: function( callback ) {
    /** Connect to the Mongo database at the URI using the client **/
    MongoClient.connect( uri, { auto_reconnect: true }, function( err, db ) {
      if (err) throw err;
      else if (!db) console.log('Unknown error connecting to database');
      else {
        console.log('Connected to MongoDB database server at:');
        console.log('\n\t%s\n', uri);
        _db = db;
      }
      return callback( err );
    } );
  },
  getDb: function() {
    return _db;
  }
};

require (‘mongodb’) .MongoClient, указанный выше, создает новый экземпляр MongoClient .

var config = require (‘./ config’) — импортирует config.js в текущий файл.

Шаг 10: Теперь давайте изменим server.js, чтобы использовать два вышеупомянутых файла, которые мы только что создали, и настроим сервер для прослушивания на указанном порту только при успешном соединении с MongoDB:

01
02
03
04
05
06
07
08
09
10
const mongodb = require('./mongodb.js');
const config = require('./config.js');
var db
 
mongodb.connectToServer( function( err ) {
  app.listen(config.server.port, function() {
     console.log('Node server listening on ' + config.server.port);
     db = mongodb.getDb();
  })
});

Шаг 11: Затем измените запрос GET в server.js, чтобы получить список сотрудников из базы данных, используя только что созданный MongoClient , следующим образом:

1
2
3
4
5
6
7
8
app.get('/employee/get', function(req, res){
  db.collection('employees').find().toArray(function(err, results) {
  res.send(results);
  })
  res.set({
    'Cache-Control': 'no-cache'
  });
});

Выполнение команды ниже перечислит всех сотрудников, которых мы создаем:

1
$ curl http://localhost:9999/employee/get

Шаг 12: Двигаемся дальше, чтобы расширить наше приложение для создания сотрудника в базе данных, добавив запрос POST . Но, прежде чем вводить POST-запрос, мы должны установить body-parser в качестве зависимости узла, которая поможет в анализе тела входящих запросов в промежуточном программном обеспечении, следующим образом:

1
2
$ cd /Users/ArpitAggarwal/nodejs-rest-api/
$ npm install --save body-parser

Как и в случае других зависимостей, мы должны импортировать его с помощью ключевого слова require, чтобы использовать возможность анализа запроса JSON следующим образом:

01
02
03
04
05
06
07
08
09
10
const bodyParser= require('body-parser')
 
app.use(bodyParser.json())
 
app.post('/employee/create', (req, res) => {
  db.collection('employees').save(req.body, (err, result) => {
    if (err) return console.log(err)
    res.send('Employee created!');
  })
})

Теперь для POST все готово , давайте создадим сотрудника:

1
$ curl -H "Content-Type: application/json" -X POST -d '{"name": "Arpit Aggarwal","email":"[email protected]"}' http://localhost:9999/employee/create

Далее мы расширим наше приложение для удаления сотрудника и определим отображение DELETE в server.js следующим образом:

1
2
3
4
5
6
7
app.delete('/employee/delete', (req, res) => {
  db.collection('employees').findOneAndDelete({name: req.body.name},
  (err, result) => {
    if (err) return res.send(500, err)
    res.send('Employee deleted!')
  })
})

Давайте проверим УДАЛИТЬ вызов:

1
curl -H "Content-Type: application/json" -X DELETE -d '{"name": "Arpit Aggarwal"}' http://localhost:9999/employee/delete

Устали от перезапуска сервера Node.js каждый раз, когда вы вносите изменения в приложение?

Если да, мы можем использовать Nodemon , утилиту, которая будет отслеживать любые изменения в нашем источнике и автоматически перезагружать наш сервер. Давайте установим это глобально:

1
$ npm install -g nodemon

После установки мы должны запустить наше приложение с nodemon вместо node , например:

1
2
$ cd /Users/ArpitAggarwal/nodejs-rest-api/
$ nodemon server.js

Полный исходный код размещен на github .