[#]: collector: (lujun9972)
[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
[#]: subject: (Using Fedora to implement REST API in JavaScript: part 2)
[#]: via: (https://fedoramagazine.org/using-fedora-to-implement-rest-api-in-javascript-part-2/)
[#]: author: (Vaclav Keil https://fedoramagazine.org/author/vaclavk/)

Using Fedora to implement REST API in JavaScript: part 2
======

![][1]

In [part 1][2] previously, you saw how to quickly create a simple API service using Fedora Workstation, Express, and JavaScript. This article shows you the simplicity of how to create a new API. This part shows you how to:

  * Install a DB server
  * Build a new route
  * Connect a new datasource
  * Use Fedora terminal to send and receive data



### Generating an app

Please refer to the [previous article][2] for more details. But to make things simple, change to your work directory and generate an app skeleton.
```

```

$ cd our-work-directory
$ npx express-generator –no-view –git /myApp
$ cd myApp
$ npm i
```

```

### Installing a database server

In this part, we’ll install MariaDB database. MariaDB is the Fedora default database.

```
$ dnf module list mariadb | sort -u ## lists the streams available
$ sudo dnf module install mariadb:10.3 ##10.4 is the latest
```

_Note: the default profile is mariadb/server_.

For those who need to spin up a Docker container a ready made container with Fedora 31 is available.

```
$ docker pull registry.fedoraproject.org/f31/mariadb
$ docker run -d --name mariadb_database -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -p 3306:3306 registry.fedoraproject.org/f31/mariadb
```

Now start the MariaDB service.

```
$ sudo systemctl start mariadb
```

If you’d like the service to start at boot, you can also enable it in systemd:

```
$ sudo systemctl enable mariadb ## start at boot
```

Next, setup the database as needed:

```
$ mysql -u root -p ## root password is blank
MariaDB> CREATE DATABASE users;
MariaDB> create user dbuser identified by ‘123456‘;
MariaDB> grant select, insert, update, create, drop on users.* to dbuser;
MariaDB> show grants for dbuser;
MariaDB> \q
```

A database connector is needed to use the database with Node.js.

```
$ npm install mariadb ## installs MariaDB Node.js connector
```

We’ll leverage Sequelize in this sample API. Sequelize is a promise-based Node.js ORM (Object Relational Mapper) for Postgres, MySQL, MariaDB, SQLite and Microsoft SQL Server.

```
$ npm install sequelize ## installs Sequelize
```

### Connecting a new datasource

Now, create a new _db_ folder and create a new file _sequelize.js_ there:

```
const Sequelize = require('sequelize'),
  sequelize = new Sequelize(process.env.db_name || 'users', process.env.db_user || 'dbuser', process.env.db_pass || '123456', {
    host: 'localhost',
    dialect: 'mariadb',
    ssl: true
})

module.exports = sequelize
```

_Note: For the sake of completeness I‘m including a link to the related Github repo: <https://github.com/vaclav18/express-api-mariadb>_

Let‘s create a new file _models/user.js_. A nice feature of a Sequelize model is that it helps us to create the necessary tables and colums automatically. The code snippet responsible for doing this is seen below:

```
sequelize.sync({
force: false
})
```

Note: never switch to true with a production database – it would _drop your tables at app start_!

We will refer to the earlier created sequelize.js this way:

```
const sequelize = require('../db/sequelize')
```

### Building new routes

Next, you’ll create a new file _routes/user.js_. You already have _routes/users.js_ from the previous article. You can copy and paste the code in and proceed with editing it.

You’ll also need a reference to the previously created model.

```
const User = require('../models/user')
```

Change the route path to _/users_ and also create a new **post** method route.

Mind the async – await keywords there. An interaction with a database will take some time and this one will do the trick. Yes, an async function returns a promise and this one makes promises easy to use.

_Note: This code is not production ready, since it would also need to include an authentication feature._

We‘ll make the new route working this way:

```
const userRouter = require('./routes/user')
app.use(userRouter)
```

Let‘s also remove the existing _usersRouter_. The _routes/users.js_ can be deleted too.

```
$ npm start
```

With the above command, you can launch your new app.

### Using the terminal to send and retrieve data

Let’s create a new database record through the post method:

```
$ curl -d 'name=Adam' http://localhost:3000/users
```

To retrieve the data created through the API, do an HTTP GET request:

```
$ curl http://localhost:3000/users
```

The console output of the curl command is a JSON array containing data of all the records in the _Users_ table.

_Note: This is not really the usual end result — an application consumes the API finally. The API will usually also have endpoints to update and remove data._

### More automation

Let‘s assume we might want to create an API serving many tables. It‘s possible and very handy to automatically generate models for Sequelize from our database. Sequelize-auto will do the heavy lifting for us. The resulting files (_models.js_) would be placed and imported within the _/models_ directory.

```
$ npm install sequelize-auto
```

A node.js connector is needed to use this one and we have it already installed for MariaDB.

### Conclusion

It‘s possible to develop and run an API using Fedora, Fedora default MariaDB, JavaScript and efficiently develop a solution like with a noSQL database. For those used to working with MongoDB or a similar noSQL database, Fedora and MariaDB are important open-source enablers.

* * *

_Photo by [Mazhar Zandsalimi][3] on [Unsplash][4]._

--------------------------------------------------------------------------------

via: https://fedoramagazine.org/using-fedora-to-implement-rest-api-in-javascript-part-2/

作者:[Vaclav Keil][a]
选题:[lujun9972][b]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

[a]: https://fedoramagazine.org/author/vaclavk/
[b]: https://github.com/lujun9972
[1]: https://fedoramagazine.org/wp-content/uploads/2020/05/javascript-api-2-816x345.jpg
[2]: https://fedoramagazine.org/using-fedora-to-quickly-implement-rest-api-with-javascript/
[3]: https://unsplash.com/@m47h4r?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
[4]: https://unsplash.com/s/photos/javascript?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText