Node 是一个让 JavaScript 运行在服务端的开发平台, 它让 JavaScript 成为与 PHP,Python,Perl,Ruby 等服务端语言平起平坐的脚本语言.
使用 node 实现前后端交互的方法:
前后端交互主要包括 3 个部分, 前端页面, 后端服务器, 以及数据库, 它们之间的关系及整个请求过程如下图所示:
其中重点在于服务器部分, 它需要实现以下功能: 解决跨域, 解析 post 及 get 参数, 与数据库建立连接, 执行 sql, 获取数据 or 更新操作, 断开连接, 处理异常, 将结果返回. 以下将对该部分进行详细说明.
简单说明 Node.JS server 需要依赖的几个重要模块:
1. express:
Node.JS 的 web 应用框架, 如下创建一个基本的 express 程序
- var express = require('express');
- var App = express();
- App.get('/', function(req, res){
- res.send('hello world');});
- App.listen(8181);
- 2. bodyParser:
express 默认使用的模块, 用于解析 http 请求,
- App.use(bodyParser.urlencoded({
- extended: false
- }));// 用于解析 req.body 数据
- 3. MySQL:
Node.JS 需要依赖的数据库模块.
解决跨域请求
- 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 , yourHeaderFeild");
- // 允许的请求类型
- res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
- res.header("X-Powered-By", '3.2.1') next();
- });
解析请求信息
1. 路由
App.VERB(path, [callback...], callback) App.VERB() 方法为 Express 提供路由方法,
VERB 是指某一个 HTTP 动作,
比如 App.get(). 例如
- App.get('/',
- function(req, res, next) {
- res.send('hello world');
- });
路径字符串会被转为正则表达式, 当接收到 get 请求之后, Express 会将请求路径与该正则表达式比较, 符合条件的会执行回调方法.
2. 解析请求参数
get 请求
- App.get('/',
- function(req, res, next) {
- var querys = req.query || {}; // 获取 get 请求的请求参数
- var query = req.originalUrl; // 获取请求 url
- res.send('hello world');
- });
post 请求
- App.post('/',
- function(req, res, next) {
- var body = req.body; // 获取 post 请求的请求参数
- var query = req.originalUrl; // 获取请求 url
- res.send('hello world');
- });
响应请求
res.send([body | status], [body]) 方法用于返回信息, status 默认为 200, 例如
- res.send({
- });
- res.send([]);
- res.send("");
- res.send(404, '{"errno":"10001","errmsg":" 访问页面或者接口不存在!"}')
与数据库交互
1. 与数据库建立连接
- connection = MySQL.createConnection({
- host: '',
- user: 'root',
- password: '******',
- database: 'test'
- });
- connection.connect();
2. 执行 sql 语句
connection.query("sql",[params], function(err, result, fields){});
例如
- var table = "table"; // 要查询的数据表
- var query = "/test"; //path 参数
- var sql = 'select content from' + table + 'where path =' + '"'+ query +'"';
- connection.query(sql,
- function(err, result, fields) {
- if (err) {
- // 失败, 执行异常处理
- } else {
- // 成功, 返回请求信息
- var firtRow = result[0] || {}; //result 为数据库检索结果
- }
- });
再如
- var table = "table"; // 要查询的数据表
- var params = ["/test", "post", "1"];
- var sql = 'UPDATE' + table + 'SET path = ?, sendtype = ?, WHERE id = ?';
- connection.query(sql, params,
- function(err, result) {
- if (err) {
- // 失败, 执行异常处理
- } else {
- // 成功, 返回请求信息
- }
- });
注意: 数据库检索结果是以键值对的形式返回的, 例如
'select content from table where id=1'// 返回的结果信息为 "content":"testcontent"
从数据库获取信息之后需要进行处理才能返回到客户端.
3. 断开连接
connection.end();
每次执行 sql 语句之后, 最好断开与数据库的连接, 下次再执行的时候再重新建立连接.
补充: node 的 MySQL 模块有问题, 当一个连接断开的时候, 立刻去建立连接, 这样循环多次会造成连接创建失败; 解决方法有 2 个, 连接不断开, 也不需要每次重新建立连接; 或者换一个模块, 不用 MySQL.
注:
Express 是一个简洁而灵活的 node.JS Web 应用框架, 提供一系列强大特性帮助你创建各种 Web 应用.
Express 不对 node.JS 已有的特性进行二次抽象, 我们只是在它之上扩展了 Web 应用所需的功能. 丰富的 HTTP 工具以及来自 Connect 框架的中间件随取随用, 创建强健, 友好的 API 变得快速又简单
来源: http://www.css88.com/qa/node-js/11937.html