本周写实验,需要提供简单的后台接口对数据库进行增删改查,以前写后台只用过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');
});
总结
感觉算是理解了语言只是工具这句话.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。