本周写实验,需要提供简单的后台接口对数据库进行增删改查,以前写后台只用过 php 和 java, 因为比较容易,用 js 写的也比较快,所以这次想用 js 实现简单的增删改查接口。
初始化
- 需要工具:nodejs
- 依赖:express,mysql,body-parser(这些都是 npm 的包)
为了能够解析 js, 需要下载 nodejs, 下载完 nodejs, 创建一个文件夹,使用 npm init 初始化, 除了填写名字,一路确定下去,在文件夹下就会多出一个 package.json 文件.
// package.json
{
"name": "test",
"version": "1.0.0",
"description": "","main":"index.js","scripts": {"test":"echo \"Error: no test specified\" && exit 1"},"author":"",
"license": "ISC"
}
为了接受并处理 http 请求, 需要引入 express 这个包, 在根目录下使用这个命令:
$ npm install express
此时就引入了 express 这个包, 创建一个 index.js 文件到根目录下, 内容:
var express = require('express');
var app = express();
app.get('/', function(req, res) {res.send('hello world!');
});
app.listen(3000, function() {console.log('server now listening at 3000 port');
});
打开终端,使用 nodejs 编译 index.js, 并且打开浏览器输入 localhost:3000 就能看到 hello world! 了:
$ node index.js
server now listening at 3000 port
这说明我们已经监听了 3000 端口并且可以用 js 来处理 http 请求了.
连接数据库
我使用的是 mysql 数据库,为了方便操作数据库,引入 mysql 这个包:
$ npm install mysql
npm WARN test@1.0.0 No description
npm WARN test@1.0.0 No repository field.
+ mysql@2.17.1
added 9 packages from 14 contributors and audited 134 packages in 4.145s
found 0 vulnerabilities
在 index.js 同路径下创建一个 db.js 专门用来处理数据库连接问题:
//db.js
var mysql = require('mysql');
var pool = mysql.createPool({ // 连接信息
host: "localhost",
user: "root",
password: "",
database: "c#learn",
port: "3306"
});
var sql = {insert:'INSERT INTO teacher(name, username, email, sex) VALUES(?,?,?,?)',
update:'update teacher set name=?, username=?, email=?, sex=? where id=?',
delete: 'delete from teacher where id=?',
queryById: 'select * from teacher where id=?',
queryAll: 'select * from teacher'
};
function query(sql, data, callback) {pool.getConnection(function(err, connection) {connection.query(sql, data, function(err, rows) {callback(err, rows);
connection.release(); // 释放连接});
});
}
exports.query = query;
exports.sql = sql;
配置数据库信息获得 pool 对象, 就可以用 pool 对象来对数据库进行操作, 在配置 sql 语句,将查询方法和 sql 语句导出给其他模块调用.
提供后台接口
在 index.js 导入 db.js, 并且将 http 请求和数据库操作对接:
var express = require('express');
var app = express();
var db = require('./db.js');
app.get('/', function(req, res) {res.header("Access-Control-Allow-Origin", "*");
db.query(db.sql.queryAll, [], function(err, rows) {res.send(JSON.stringify(rows));
});
});
这时再访问 localhost:3000 就能看我们 teacher 表中所有的记录了。app.listen(3000, function() {console.log('server now listening at 3000 port');
});
另外, 为了读取 post 和 put 里的 body 信息, 我们需要 body-parser 这个包:
$ npm install body-parser
使用 bodyParser 来配置 app:
//index.js
var express = require('express');
var db = require('./db.js');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json());
这时就可以用 req.body 读取请求体了.
完整代码:
var express = require('express');
var db = require('./db.js');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.get('/', function(req, res) {res.header("Access-Control-Allow-Origin", "*");
db.query(db.sql.queryAll, [], function(err, rows) {console.log('err', err, 'rows', rows);
res.send(JSON.stringify(rows));
});
});
app.get('/:id', function(req, res) {res.header("Access-Control-Allow-Origin", "*");
db.query(db.sql.queryById, [req.params.id], function(err, rows) {res.send(JSON.stringify(rows));
});
});
app.post('', function(req, res) {res.header("Access-Control-Allow-Origin", "*");
console.log(req.body.name);
var teacher = req.body;
db.query(db.sql.insert, [teacher.name, teacher.username, teacher.email, teacher.sex], function(err, rows) {if (err) {res.status(500);
res.send('insert error');
} else {res.status(200);
res.send('insert success');
}
});
});
app.put('/:id', function(req, res) {res.header("Access-Control-Allow-Origin", "*");
var teacher = req.body;
var array = [teacher.name, teacher.username, teacher.email, teacher.sex, req.params.id];
db.query(db.sql.update, array, function(err, rows) {if (err) {res.status(500);
res.send('update error');
} else {res.status(200);
res.send('update success');
}
});
});
app.delete('/:id', function(req, res) {res.header("Access-Control-Allow-Origin", "*");
db.query(db.sql.delete, [req.params.id], function(err, rows) {if (err) {res.status(500);
res.send('delete error');
} else {res.status(200);
res.send('delete success');
}
});
});
app.listen(3000, function() {console.log('server now listening at 3000 port');
});
总结
感觉算是理解了语言只是工具这句话.