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.

  1. var express = require('express'),
  2. app = express(),
  3. mysql = require('mysql');
  4. app.listen(3000);
  5. console.log('Rest Demo Listening on port 3000');

DB Connection

Setup your database and create a pool of connections to MySQL server;

  1. var express = require('express'),
  2. app = express(),
  3. mysql = require('mysql'),
  4. connectionpool = mysql.createPool({
  5. host : 'localhost',
  6. user : 'root',
  7. password : 'secret',
  8. database : 'rest_demo'
  9. });
  10. app.listen(3000);
  11. 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.

  1. var express = require('express'),
  2. app = express(),
  3. mysql = require('mysql'),
  4. connectionpool = mysql.createPool({
  5. host : 'localhost',
  6. user : 'root',
  7. password : 'secret',
  8. database : 'rest_demo'
  9. }),
  10. res.setHeader({ 'Content-Type': 'application/json' });
  11. app.get('/:table', function(req,res){});
  12. app.get('/:table/:id', function(req,res){});
  13. app.post('/:table', function(req,res){});
  14. app.put('/:table/:id', function(req,res){});
  15. app.delete('/:table/:id', function(req,res){});
  16. app.listen(3000);
  17. 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.

  1. var express = require('express'),
  2. app = express(),
  3. mysql = require('mysql'),
  4. connectionpool = mysql.createPool({
  5. host : 'localhost',
  6. user : 'root',
  7. password : 'secret',
  8. database : 'rest_demo'
  9. });
  10. res.setHeader({ 'Content-Type': 'application/json' });
  11. app.get('/:table', function(req,res){
  12. connectionpool.getConnection(function(err, connection) {
  13. if (err) {
  14. console.error('CONNECTION error: ',err);
  15. res.statusCode = 503;
  16. res.send({
  17. result: 'error',
  18. err: err.code
  19. });
  20. } else {
  21. // query the database using connection
  22. }
  23. });
  24. });

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;

  1. var express = require('express'),
  2. app = express(),
  3. mysql = require('mysql'),
  4. connectionpool = mysql.createPool({
  5. host : 'localhost',
  6. user : 'root',
  7. password : 'secret',
  8. database : 'rest_demo'
  9. });
  10. app.get('/:table', function(req,res){
  11. connectionpool.getConnection(function(err, connection) {
  12. if (err) {
  13. console.error('CONNECTION error: ',err);
  14. res.statusCode = 503;
  15. res.send({
  16. result: 'error',
  17. err: err.code
  18. });
  19. } else {
  20. connection.query('SELECT * FROM '+req.params.table+' ORDER BY id DESC LIMIT 20', req.params.id, function(err, rows, fields) {
  21. if (err) {
  22. console.error(err);
  23. res.statusCode = 500;
  24. res.send({
  25. result: 'error',
  26. err: err.code
  27. });
  28. }
  29. res.send({
  30. result: 'success',
  31. err: '',
  32. fields: fields,
  33. json: rows,
  34. length: rows.length
  35. });
  36. connection.release();
  37. });
  38. }
  39. });
  40. });
  41. app.get('/:table/:id', function(req,res){});
  42. app.post('/:table', function(req,res){});
  43. app.put('/:table/:id', function(req,res){});
  44. app.delete('/:table/:id', function(req,res){});
  45. app.listen(3000);
  46. 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的更多相关文章

  1. Nodejs学习笔记(五)--- Express安装入门与模版引擎ejs

    目录 前言 Express简介和安装 运行第一个基于express框架的Web 模版引擎 ejs express项目结构 express项目分析 app.set(name,value) app.use ...

  2. Nodejs学习笔记(五)—Express安装入门与模版引擎ejs

    前言 前面也学习了一些Node.js的基本入门知道,现在开始进入Web开发的部分: Node.js提供了http模块,这个模块中提供了一些底层接口,可以直接使用,但是直接开发网站那还是太累了,所以ht ...

  3. 转 用C API 操作MySQL数据库

    用C API 操作MySQL数据库 参考MYSQL的帮助文档整理 这里归纳了C API可使用的函数,并在下一节详细介绍了它们.请参见25.2.3节,“C API函数描述”. 函数 描述 mysql_a ...

  4. .NET框架 - NETCORE + API + EF + MYSQL

    .NET框架 - NETCORE + API + EFCORE + MYSQL 1. 新建项目: 本文中使用 框架 .netcore2.2 . 2. 生成项目框架 3 安装MYSQL插件 点击“工具” ...

  5. nodejs cannot find module 'mysql' 问题分析

    在windows平台下,测试nodejs连接mysql数据库. 首先 在控制台中安装mysql依赖包 npm install mysql 安装成功后,mysql依赖包可以在User目录中的node_m ...

  6. C Mysql API连接Mysql

    最近都在查看MYsql C API文档,也遇到了很多问题,下面来简单的做一个总结. mysql多线程问题 mysql多线程处理不好,经常会发生coredump,见使用Mysql出core一文. 单线程 ...

  7. nodejs中如何使用mysql数据库[node-mysql翻译]

    nodejs中如何使用mysql数据库 db-mysql因为node-waf: not found已经不能使用,可以使用mysql代替. 本文主要是[node-mysql]: https://www. ...

  8. nodejs中如何连接mysql

    nodejs中如何连接mysql,下面给出一个小Demo. 第一步安装mysql模块npm install mysql 第二步导入mysql模块var mysql = require('mysql') ...

  9. nodejs使用sequelize操作mysql实例

    sequelize是node操作mysql的一款npm包,包含很多特性:数据库模型映射.事务处理.模型属性校验.关联映射等,花了两天时间学习了下基本的一些操作,特别是关联映射部分的操作,包含1:1.1 ...

随机推荐

  1. substr使用注意

    substr使用时要判断起点和长度是否超过了串本身的长度,否则会抛异常

  2. php返回HTTP状态码

    HTTP协议状态码,调用函数时候只需要将$num赋予一个下表中的已知值就直接会返回状态了.<?PHP /** * HTTP Protocol defined status codes* HTTP ...

  3. 用Cocoapods集成XMPPFramework 遇 Module 'KissXML' not found 问题

    用Coacopods集成XMPPFramework完成后Command + B,报Module 'KissXML' not found 一般来说,通过Coacopods集成集成第三方框架,不会再有依赖 ...

  4. 解决火狐访问(localhost)本地网站提示输入用户名密码

    VS在调试程序时浏览器一直提示要输入用户名及密码,但是我程序根本没有登录界面,最后终于找到了解决方案,如下: 1.在火狐浏览器地址栏中输入:about:config 2.然后在搜索文本框中输入:NTL ...

  5. The server must be started under an unprivileged user ID to prevent

    mysql8 PostgreSQL [root@test local]# postgres -D /usr/local/pgsql/data"root" execution of ...

  6. eclipse调试第三方jar包需要源码的问题

    很多时候测试自己的jar包功能时,需要有一个测试工程导入该jar包,但是一般在调试的时候,需要跟进去看看步骤和逻辑是否正确,这个时候就需要在jar包的源码中下断点.最近刚好自己也会经常这样做,也遇到了 ...

  7. 在windows下把Mongodb设置系统服务

    把Mongodb Server 设置为系统,方便启动与停止 今天一时兴起在本地安装了下Mongodb服务,安装完后,创建了配置文件为数据库服务指明在哪里存储数据库原始文件,随即就启动了mongo se ...

  8. Vue中的methods、watch、computed

    看到这个标题就知道这篇文章接下来要讲的内容,我们在使用vue的时候methods.watch.computed这三个特性一定经常使用,因为它们是非常的有用,但是没有彻底的理解它们的区别和各自的使用场景 ...

  9. Juery插件-- jquery.cookie.js

    1.引入jquery <script src="scripts/jquery-1.8.8.js" type="text/javascript">&l ...

  10. jquery中attr和prop的区别—判断复选框选中状态

    最近项目中需要用jquery判断input里checkbox是否被选中,发现用attr()获取不到复选框改变后的状态,最后查资料发现jQuery 1.6以后新增加了prop()方法,借用官方的一段描述 ...