TranslateProject/sources/tech/20200518 Using Fedora to implement REST API in JavaScript- part 2.md
DarkSun 9a81323aeb 选题: 20200518 Using Fedora to implement REST API in JavaScript: part 2
sources/tech/20200518 Using Fedora to implement REST API in JavaScript- part 2.md
2020-05-25 19:24:06 +08:00

209 lines
6.7 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[#]: 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, well 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 youd 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
```
Well 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 Im including a link to the related Github repo: <https://github.com/vaclav18/express-api-mariadb>_
Lets 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, youll 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.
Youll 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._
Well make the new route working this way:
```
const userRouter = require('./routes/user')
app.use(userRouter)
```
Lets 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
Lets 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
Lets assume we might want to create an API serving many tables. Its 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
Its 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