1.环境
检查是否安装node、express
没有安装先去安装
node: node安装就不将了
express: http://caibaojian.com/expressjs/starter/generator.html
2.初始化项目
// 创建项目
express myapp
// 安装两个依赖
npm i body-parser
npm i mysql
3.项目结构
4.项目代码
// bin/www
/**
* Module dependencies. 加载依赖
*/
var app = require('../app');
var debug = require('debug')('myapp:server');
var http = require('http');
/**
* Get port from environment and store in Express. 启动的端口
*/
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
* Create HTTP server. 创建一个服务
*/
var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces. 启动网络服务监听端口
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Normalize a port into a number, string, or false. 端口标准化函数
*/
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event. HTTP异常事件处理函数
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event. 事件绑定函数
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
// app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser'); //方便操作cookie
var logger = require('morgan'); //日志
const bodyParser = require('body-parser') // HTTP请求体解析
var indexRouter = require('./routes/index'); //路由
var app = express();
// 新增设置响应头
app.all('/*', function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With');
res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
if (req.method == 'OPTIONS') {
res.sendStatus(200);
}
else {
next();
}
});
// view engine setup
// 定义日志和输出级别
app.use(logger('dev'));
// 默认的json解析器
// app.use(express.json());
// app.use(express.urlencoded({ extended: false }));
// cookie解析器
app.use(cookieParser());
// 访问静态文件
app.use(express.static(path.join(__dirname, 'public')));
// json解析器
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }));
// 路由
app.use('/', indexRouter);
// catch 404 and forward to error handler 自定义404中间件(框架生成)
app.use(function(req, res, next) {
next(createError(404));
});
// error handler 自定义错误抛出中间件 (框架生成)
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
// conf/dbConfig.js
const config = {
port: 3000,
database: {
DATABASE: 'xxxx', //数据库名
USERNAME: 'xxx', //用户
PASSWORD: 'xxxx', //密码
HOST: 'xxx.xx.xx.x', //ip
PORT: '3306', //端口号
insecureAuth: true,
useConnectionPooling: true,
multipleStatements: true
}
}
module.exports = config
// conf/DBHelp.js
let DB_MYSQL = require('mysql');
let DB_CONFIG = require('./dbConfig');
/**
* 数据库连接池
* @type {Pool}
*/
let pool = DB_MYSQL.createPool({
database: DB_CONFIG.database.DATABASE,
user: DB_CONFIG.database.USERNAME,
password: DB_CONFIG.database.PASSWORD,
host: DB_CONFIG.database.HOST,
port: DB_CONFIG.database.PORT
});
/**
* 通用方法
* @param sql
* @param options
* @param callback
*/
let query = (sql, options, callback) => {
pool.getConnection((error, connection) => {
if (error) {
callback(error, null, null);
} else {
connection.query(sql, options, (error, results, fields) => {
// 注意:这里是一个坑,用下面的代码来断开连接的话会出现并发的问题
// connection.release();
callback(error, results, fields);
});
}
// 每次查询后断开连接
pool.releaseConnection(connection);
});
};
module.exports = query;
// dao/userDao.js
let DBHelp = require('../conf/DBHelp');
module.exports = {
login: (data, success) => {
let sql = "SELECT * FROM `user` WHERE userName=" + `'${data.userName}'` + " AND userPass=" + `'${data.userPass}'`;
console.log(sql);
DBHelp(sql, (error, result, fields) => {
if (error) {
return success({ code: "-1", error: error.message });
}
return success({ code: "200", message: "success"});
})
}
}
// public/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h2>API 开发</h2>
</body>
</html>
// routes/index.js
var express = require('express');
var router = express.Router();
const userDap = require("../dao/userDao")
/* 登录 */
router.post('/login', function (req, res) {
const data = {
userName: req.body.userName,
userPass: req.body.userPass
}
userDap.login(data, content => {
res.json(content);
})
});
module.exports = router;
运行和测试
npm run start
如有疑问或补充请提出来。
转载请附上链接,谢谢