NodeJS REST API with MySQL and Express
http://www.nodewiz.biz/nodejs-rest-api-with-mysql-and-express/
NPM Modules
- Express
- felixge/node-mysql - Source
Most articles about building a REST API for NodeJS will be based on MongoDB, I'm going to show you how to do it with MySQL.
Implementing the REST API
To implement all the routes required by the API, the full REST API for the node application will be a single file server.js which consists of the following methods:
| Verb | URI | Action |
|---|---|---|
| GET | /tableName | Retrieve all wines |
| GET | /tableName/id | Retrieve the wine with the specified _id |
| POST | /tableName | Add a new wine |
| PUT | /tableName/id | Update wine with the specified _id |
| DELETE | /tableName/id | Delete the wine with the specified _id |
Structure
Require your modules and create a http server based on express framework.
- var express = require('express'),
- app = express(),
- mysql = require('mysql');
- app.listen(3000);
- console.log('Rest Demo Listening on port 3000');
DB Connection
Setup your database and create a pool of connections to MySQL server;
- var express = require('express'),
- app = express(),
- mysql = require('mysql'),
- connectionpool = mysql.createPool({
- host : 'localhost',
- user : 'root',
- password : 'secret',
- database : 'rest_demo'
- });
- app.listen(3000);
- console.log('Rest Demo Listening on port 3000');
Where the configuration uses your host, username, password, and database name of course.
Routes
Your application will only need five REST routes to cover the methods table above.
- var express = require('express'),
- app = express(),
- mysql = require('mysql'),
- connectionpool = mysql.createPool({
- host : 'localhost',
- user : 'root',
- password : 'secret',
- database : 'rest_demo'
- }),
- res.setHeader({ 'Content-Type': 'application/json' });
- app.get('/:table', function(req,res){});
- app.get('/:table/:id', function(req,res){});
- app.post('/:table', function(req,res){});
- app.put('/:table/:id', function(req,res){});
- app.delete('/:table/:id', function(req,res){});
- app.listen(3000);
- console.log('Rest Demo Listening on port 3000');
Each route takes a callback function with request and response objects.
You may also notice we are going to be sending json Content-Type as a response always. I will set it up so that even errors will be responding in json, this is personal preference and you might want to do something else but i see it with AWS, Google, Facebook, ect so figured its generally a good idea.
Connection and Error Handling
We will be getting a connection from our pool, which may have reached its allocated limit and throw an error which needs to be handled.
- var express = require('express'),
- app = express(),
- mysql = require('mysql'),
- connectionpool = mysql.createPool({
- host : 'localhost',
- user : 'root',
- password : 'secret',
- database : 'rest_demo'
- });
- res.setHeader({ 'Content-Type': 'application/json' });
- app.get('/:table', function(req,res){
- connectionpool.getConnection(function(err, connection) {
- if (err) {
- console.error('CONNECTION error: ',err);
- res.statusCode = 503;
- res.send({
- result: 'error',
- err: err.code
- });
- } else {
- // query the database using connection
- }
- });
- });
When we encounter connection errors node.js will log them to the console and our app will respond with http status code 503 Service Unavailable with a mysql server error code.
Querying MySQL
Our routes will define a table name and if required an id, which we will use to build our query and return some json data.
Take a look at fetching the latest 20 rows;
- var express = require('express'),
- app = express(),
- mysql = require('mysql'),
- connectionpool = mysql.createPool({
- host : 'localhost',
- user : 'root',
- password : 'secret',
- database : 'rest_demo'
- });
- app.get('/:table', function(req,res){
- connectionpool.getConnection(function(err, connection) {
- if (err) {
- console.error('CONNECTION error: ',err);
- res.statusCode = 503;
- res.send({
- result: 'error',
- err: err.code
- });
- } else {
- connection.query('SELECT * FROM '+req.params.table+' ORDER BY id DESC LIMIT 20', req.params.id, function(err, rows, fields) {
- if (err) {
- console.error(err);
- res.statusCode = 500;
- res.send({
- result: 'error',
- err: err.code
- });
- }
- res.send({
- result: 'success',
- err: '',
- fields: fields,
- json: rows,
- length: rows.length
- });
- connection.release();
- });
- }
- });
- });
- app.get('/:table/:id', function(req,res){});
- app.post('/:table', function(req,res){});
- app.put('/:table/:id', function(req,res){});
- app.delete('/:table/:id', function(req,res){});
- app.listen(3000);
- console.log('Rest Demo Listening on port 3000');
Other than the error handling (which returns a http code 500) we have responded to the requester with up to 20 rows of data.
They also get the field names and how many rows were returned.
Putting It All Together
Using the above technique we put together our server.js like so, which comes in at 175 lines in total.
Source GitHub
Note:
Do not use this in production, it is simply a demo.
The main issue is with the varible table name part in the routing, this is a BADidea.
The first thing I would change is encapsulion of each database table in its own js file under a routes directory, then require the needed js file for each request.
I hope you have enjoyed this demo - please leave your feedback below.
@NodeJS REST API with MySQL and Express http://t.co/NEvSjddwPz#nodewiz @codewiz_biz
— Codewiz.biz (@codewiz_biz) November 20, 2013
NodeJS REST API with MySQL and Express的更多相关文章
- Nodejs学习笔记(五)--- Express安装入门与模版引擎ejs
目录 前言 Express简介和安装 运行第一个基于express框架的Web 模版引擎 ejs express项目结构 express项目分析 app.set(name,value) app.use ...
- Nodejs学习笔记(五)—Express安装入门与模版引擎ejs
前言 前面也学习了一些Node.js的基本入门知道,现在开始进入Web开发的部分: Node.js提供了http模块,这个模块中提供了一些底层接口,可以直接使用,但是直接开发网站那还是太累了,所以ht ...
- 转 用C API 操作MySQL数据库
用C API 操作MySQL数据库 参考MYSQL的帮助文档整理 这里归纳了C API可使用的函数,并在下一节详细介绍了它们.请参见25.2.3节,“C API函数描述”. 函数 描述 mysql_a ...
- .NET框架 - NETCORE + API + EF + MYSQL
.NET框架 - NETCORE + API + EFCORE + MYSQL 1. 新建项目: 本文中使用 框架 .netcore2.2 . 2. 生成项目框架 3 安装MYSQL插件 点击“工具” ...
- nodejs cannot find module 'mysql' 问题分析
在windows平台下,测试nodejs连接mysql数据库. 首先 在控制台中安装mysql依赖包 npm install mysql 安装成功后,mysql依赖包可以在User目录中的node_m ...
- C Mysql API连接Mysql
最近都在查看MYsql C API文档,也遇到了很多问题,下面来简单的做一个总结. mysql多线程问题 mysql多线程处理不好,经常会发生coredump,见使用Mysql出core一文. 单线程 ...
- nodejs中如何使用mysql数据库[node-mysql翻译]
nodejs中如何使用mysql数据库 db-mysql因为node-waf: not found已经不能使用,可以使用mysql代替. 本文主要是[node-mysql]: https://www. ...
- nodejs中如何连接mysql
nodejs中如何连接mysql,下面给出一个小Demo. 第一步安装mysql模块npm install mysql 第二步导入mysql模块var mysql = require('mysql') ...
- nodejs使用sequelize操作mysql实例
sequelize是node操作mysql的一款npm包,包含很多特性:数据库模型映射.事务处理.模型属性校验.关联映射等,花了两天时间学习了下基本的一些操作,特别是关联映射部分的操作,包含1:1.1 ...
随机推荐
- http协议的Last-Modified
$modified_time = $_SERVER['HTTP_IF_MODIFIED_SINCE']; if (strtotime($modified_time) + 3600 > time( ...
- svn 命令个
svn 命令行下常用的几个命令 标签: svnpathdelete工作urlfile 2011-11-28 08:16 128627人阅读 评论(1) 收藏 举报 分类: 版本控制(8) 版权声明 ...
- 系统安全-SElinux
Selinux是[security-Enhanced Linux]的简称,是美国国家安全局[NSA]和[SCC]开发的Linux的一个扩张强制访问控制安全模块. 因为企业的业务平台的服务器上存储着大量 ...
- Vue使用axios
main.js------------------- import axios from "axios"; import qs from "qs"; imp ...
- (非原)SQL注入专题--整理帖 && like 语句拼sql 如何防止注入攻击。
原地址:blog.csdn.net/lvjin110/article/details/28697695 like 语句拼sql 如何防止注入攻击?http://bbs.csdn.net/topics/ ...
- BZOJ 2069 POI2004 ZAW 堆优化Dijkstra
题目大意:给定一张无向图.每条边从两个方向走各有一个权值,求从点1往出走至少一步之后回到点1且不经过一条边多次的最短路 显然我们须要从点1出发走到某个和点1相邻的点上,然后沿最短路走到还有一个和点1相 ...
- Linux就该这么学--命令集合6(打包压缩文件、文件查询搜索命令)
1.tar命令用于对文件打包压缩或解压:(tar [选项] [文件]) 打包并压缩文件:tar -czvf 压缩包名.tar.gz 文件名 解压并展开压缩包:tar -xzvf 压缩包名.tar.gz ...
- java web service
1.编写服务代码 服务代码提供了两个函数,分别为sayHello和sayHelloToPerson,源代码如下: /* * File name: HelloService.java * * Versi ...
- Redis之Ubuntu开机启动
1.编译源码,生成可执行文件: 2.将生成的可执行文件拷贝到 /user/local/bin目录下,若没有x权限请加上: 3.将安装包中的 redis.conf配置文件移到/etc/redis.con ...
- 【mysql】mysql innodb 配置详解
MySQL innodb 配置详解 innodb_buffer_pool_size:这是InnoDB最重要的设置,对InnoDB性能有决定性的影响.默认的设置只有8M,所以默认的数据库设置下面Inno ...