带有Node.js和Express 4的RESTful API

在本教程中,我们将学习如何使用Node.js和Express创建基本的REST API,它们从MySQL数据库检索数据并以JSON格式给出响应。

本教程适用于Node.js的初学者和中级用户。

最后更新 :

此帖子已根据用户的要求在2015年3月21日更新。 以下是更改日志。

  • 使SQL查询准备好语句。
  • 使密码散列,请勿将其用作纯文本。
  • 更新REST API。

通过上述更改,Github上的代码已更新,因此您可以从此处下载最新的代码。

介绍 :

什么是REST? 根据维基百科

代表性状态转移(REST)是一种软件体系结构样式,由用于创建可伸缩Web服务的指南和最佳实践组成.REST是一组协调的约束,适用于分布式超媒体系统中组件的设计,可以带来更高的性能和可维护性建筑。

实际上,如果Web服务支持统一行为,无状态,允许缓存并提供高水平的数据抽象,则很有可能将其称为REST api。

数据库设计:

user_login将存储特定用户的登录信息,并且每个用户都有一个唯一的ID。 user_info将存储有关用户的更多信息,并且对user_login表和user_status表具有外键约束。

[下载代码](https://github.com/codeforgeek/RESTful-api-using-nodejs/archive/master.zip)

在MySQL中通过phpmyadmin将数据库名称创建为“ restful_api_demo” ,然后转到SQL选项卡并复制/粘贴以下代码以创建上述表。

SQL代码

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
 CREATE SCHEMA IF NOT EXISTS `restful_api_demo` DEFAULT CHARACTER SET latin1 ; 
USE `restful_api_demo` ;
 -- ----------------------------------------------------- 
-- Table `restful_api_demo`.`user_login`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `restful_api_demo`.`user_login` ;
 CREATE TABLE IF NOT EXISTS `restful_api_demo`.`user_login` ( 
`user_id` INT(70) NOT NULL AUTO_INCREMENT,
`user_email` VARCHAR(45) NOT NULL,
`user_password` VARCHAR(45) NULL,
`user_join_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`user_id`),
UNIQUE INDEX `user_email_UNIQUE` (`user_email` ASC))
ENGINE = InnoDB;

 -- ----------------------------------------------------- 
-- Table `restful_api_demo`.`user_info`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `restful_api_demo`.`user_info` ;
 CREATE TABLE IF NOT EXISTS `restful_api_demo`.`user_info` ( 
`user_info_id` INT(70) NOT NULL AUTO_INCREMENT,
`user_id_fk` INT(70) NOT NULL,
`user_name` VARCHAR(45) NULL,
`user_location` VARCHAR(45) NULL,
PRIMARY KEY (`user_info_id`),
UNIQUE INDEX `user_id_fk_UNIQUE` (`user_id_fk` ASC),
CONSTRAINT `user_info_foreign_key`
FOREIGN KEY (`user_id_fk`)
REFERENCES `restful_api_demo`.`user_login` (`user_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

 -- ----------------------------------------------------- 
-- Table `restful_api_demo`.`user_status`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `restful_api_demo`.`user_status` ;
 CREATE TABLE IF NOT EXISTS `restful_api_demo`.`user_status` ( 
`user_status_id` INT(70) NOT NULL AUTO_INCREMENT,
`user_id_fk` INT(70) NOT NULL,
`status_text` TEXT NULL DEFAULT NULL,
`status_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`user_status_id`),
UNIQUE INDEX `user_id_fk_UNIQUE` (`user_id_fk` ASC),
CONSTRAINT `user_status_foreign_key`
FOREIGN KEY (`user_id_fk`)
REFERENCES `restful_api_demo`.`user_login` (`user_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
 SET SQL_MODE=@OLD_SQL_MODE; 
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

您可以使用此代码并在PHPMyadmin中运行它来创建数据库和表。

我们的项目 :

在转向代码之前,让我解释一下目录结构。

 -----+ node_modules ( folder ) 
--------+ package.json //contains package information.
--------+ Server.js //contains Express code
--------+ REST.js // contains api code

首先,让我们安装所需的依赖项。 创建项目目录并创建package.json文件并粘贴以下代码。

Package.json

 { 
"name": "RESTful-API",
"version": "0.0.1",
"scripts": {
"start": "node Server.js"
},
"dependencies": {
"express": "~4.12.2",
"mysql": "~2.5.5",
"body-parser": "~1.12.0",
"MD5": "~1.2.1"
}
}

通过键入安装依赖项

 npm install 

安装完成后,请继续下一步!

假设说“ Hello World!”

让我们构建一个简单的api,每次点击它就会返回“ Hello World”。 这是Server.js文件。 我正在使用原型编程样式来对代码进行模块化。

Server.js

 var express = require("express"); 
var mysql = require("mysql");
var bodyParser = require("body-parser");
var md5 = require('MD5');
var rest = require("./REST.js");
var app = express();
 function REST(){ 
var self = this;
self.connectMysql();
};
 REST.prototype.connectMysql = function() { 
var self = this;
var pool = mysql.createPool({
connectionLimit : 100,
host : 'localhost',
user : 'root',
password : '',
database : 'restful_api_demo',
debug : false
});
pool.getConnection(function(err,connection){
if(err) {
self.stop(err);
} else {
self.configureExpress(connection);
}
});
}
 REST.prototype.configureExpress = function(connection) { 
var self = this;
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
var router = express.Router();
app.use('/api', router);
var rest_router = new rest(router,connection,md5);
self.startServer();
}
 REST.prototype.startServer = function() { 
app.listen(3000,function(){
console.log("All right ! I am alive at Port 3000.");
});
}
 REST.prototype.stop = function(err) { 
console.log("ISSUE WITH MYSQL n" + err);
process.exit(1);
}
 new REST(); 

这是REST.js。

REST.js

 function REST_ROUTER(router,connection,md5) { 
var self = this;
self.handleRoutes(router,connection,md5);
}
 REST_ROUTER.prototype.handleRoutes= function(router,connection,md5) { 
router.get("/",function(req,res){
res.json({"Message" : "Hello World !"});
})
}
 module.exports = REST_ROUTER; 

保存两个文件。 确保MySQL正在运行,并且您的系统已安装npm和node。 转到项目目录并输入

 npm start 

执行项目。 您应该在控制台上看到类似这样的内容。

现在,由于我们的服务器在端口3000上运行,因此可以测试api。 您可以使用任何REST模拟器,但建议您使用POSTMAN。 从此处下载Chrome版。

这是使用Postman打API的方法。

现在我们已经准备好了“ Hello World” api,让我们开发一些真实的东西吧!

构建API:

这是我们要构建的api的列表。 更改将仅在REST.js文件中完成。

#1:POST /用户

该API将接收电子邮件和密码,并将其插入数据库中。 这是代码

在实际情况下,切勿以纯文本形式存储密码。 始终加密并存储在数据库中。
我们正在使用MD5模块对密码进行哈希处理并将其插入数据库中。

REST.js

 var mysql = require("mysql"); 
function REST_ROUTER(router,connection,md5) {
var self = this;
self.handleRoutes(router,connection,md5);
}
 REST_ROUTER.prototype.handleRoutes= function(router,connection,md5) { 
router.get("/",function(req,res){
...................
});
router.post("/users",function(req,res){
var query = "INSERT INTO ??(??,??) VALUES (?,?)";
var table = ["user_login","user_email","user_password",req.body.email,md5(req.body.password)];
query = mysql.format(query,table);
connection.query(query,function(err,rows){
if(err) {
res.json({"Error" : true, "Message" : "Error executing MySQL query"});
} else {
res.json({"Error" : false, "Message" : "User Added !"});
}
});
});
}
 module.exports = REST_ROUTER; 

这是上面代码的输出。

查看添加新用户的数据库。

#2:获取/用户

此api返回数据库中的所有用户。 这是代码。

REST.js

 var mysql = require("mysql"); 
function REST_ROUTER(router,connection,md5) {
var self = this;
self.handleRoutes(router,connection,md5);
}
 REST_ROUTER.prototype.handleRoutes= function(router,connection,md5) { 
router.get("/",function(req,res){
...........
});
  router.post("/users",function(req,res){ 
...........
});
router.get("/users",function(req,res){
var query = "SELECT * FROM ??";
var table = ["user_login"];
query = mysql.format(query,table);
connection.query(query,function(err,rows){
if(err) {
res.json({"Error" : true, "Message" : "Error executing MySQL query"});
} else {
res.json({"Error" : false, "Message" : "Success", "Users" : rows});
}
});
});
  router.get("/users/:user_id",function(req,res){ 
var query = "SELECT * FROM ?? WHERE ??=?";
var table = ["user_login","user_id",req.params.user_id];
query = mysql.format(query,table);
connection.query(query,function(err,rows){
if(err) {
res.json({"Error" : true, "Message" : "Error executing MySQL query"});
} else {
res.json({"Error" : false, "Message" : "Success", "Users" : rows});
}
});
});
 } 
 module.exports = REST_ROUTER; 

这是上面api的输出。
情况1:获取所有用户。

情况2:按ID获取用户。

#3:PUT /用户

该API使用PUT HTTP动词,它将通过传递用户的电子邮件ID来更新用户的密码。 这是代码。

REST.js

 var mysql = require("mysql"); 
function REST_ROUTER(router,connection,md5) {
var self = this;
self.handleRoutes(router,connection,md5);
}
 REST_ROUTER.prototype.handleRoutes= function(router,connection,md5) { 
router.get("/",function(req,res){
.................
});
  router.post("/users",function(req,res){ 
.................
});
  router.get("/users",function(req,res){ 
.................
});
  router.get("/users/:userId",function(req,res){ 
.................
});
  router.put("/users",function(req,res){ 
var query = "UPDATE ?? SET ?? = ? WHERE ?? = ?";
var table = ["user_login","user_password",md5(req.body.password),"user_email",req.body.email];
query = mysql.format(query,table);
connection.query(query,function(err,rows){
if(err) {
res.json({"Error" : true, "Message" : "Error executing MySQL query"});
} else {
res.json({"Error" : false, "Message" : "Updated the password for email "+req.body.email});
}
});
});
}
 module.exports = REST_ROUTER; 

这是上述API的输出。

#4:删除/ users /:email

此API将以电子邮件ID为输入从数据库中删除用户。 这是代码。

REST.js

 var mysql = require("mysql"); 
function REST_ROUTER(router,connection,md5) {
var self = this;
self.handleRoutes(router,connection,md5);
}
 REST_ROUTER.prototype.handleRoutes= function(router,connection,md5) { 
router.get("/",function(req,res){
....................
});
  router.post("/users",function(req,res){ 
....................
});
  router.get("/users/:user_id",function(req,res){ 
....................
});
  router.get("/users",function(req,res){ 
....................
});
  router.put("/users",function(req,res){ 
....................
});
  router.delete("/users/:email",function(req,res){ 
var query = "DELETE from ?? WHERE ??=?";
var table = ["user_login","user_email",req.params.email];
query = mysql.format(query,table);
connection.query(query,function(err,rows){
if(err) {
res.json({"Error" : true, "Message" : "Error executing MySQL query"});
} else {
res.json({"Error" : false, "Message" : "Deleted the user with email "+req.params.email});
}
});
});
}
 module.exports = REST_ROUTER; 

这是上面代码的输出。

您可以根据需要和数据模型开发更多的api。

结论:

REST api对于任何Web应用程序,移动应用程序,系统软件等都非常有用。由于其资源共享功能,您可以开发REST api并在任何地方使用它。

通过以上解释,我希望您了解REST api的基础知识,以及如何为您的系统开发一个。

家庭作业:

尝试开发API以在user_status表中添加新状态,并使用用户ID提取该状态或获取所有状态。

您还可以创建另一个表并对其进行更多探索! 让我知道您是否在某些地方卡住了!

建议

☞通过构建12个项目来学习Nodejs

☞Node程序:使用Node.js和MongoDB从0到Hero

☞完整的Node JS开发人员课程

☞学习和理解NodeJS

☞建立一个亚马逊克隆:Nodejs + MongoDB + Stripe Payment