Node代码片段

Node与Mysql交互

采用node-mysql开源项目作为Node框架的MySQL扩展库包括以下方面:

1. 连接MySQL数据库操作
2. 查询MySQL数据库操作
3. 修改MySQL数据库操作
4. 插入MySQL数据库操作
5. 删除MySQL数据库操作
6. MySQL数据库连接池

连接MySQL数据库操作

console.info("------  mysql connetion()  ------");
console.info();
var http = require("http");  // 引入HTTP模块
var mysql = require("/usr/local/lib/node_modules.mysql");  // 引入mysql模块
console.log("Now start HTTP server on port 6868...");
console.info();
/**
  * 创建数据库连接
  */
var connection = mysql.createConnection({
  host: "localhoset",  // 主机地址
  user: "root",  // 数据库用户名
  password: "root",  // 数据库密码
  database: "nodejs",  // 数据库名称
  port: 3306  // 端口号
});

/**
  * 创建HTTP服务器
  */
http.createServer(function(req, res) {
  res.writeHead(200, {"Content-Type": "text/html;charset=utf8"});
  res.write("<h3>测试 Node.js-MySQL 数据库;连接!</h3><br/>");
  /**
    * 测试数据库连接
    */
  connection.connect(function(err) {
    if(err) {
      res.end("<p>Error Connected to MySQL!</p>");
      return;
    } else {
      res.end('<p>Connected to MySQL!</p>');
    }
  });

}).listen(6868);  // 监听6868端口号

查询MySQL数据库操作

console.log("------ mysql query() ------");
console.info();
var http = require("http");  // 引入HTTP模块
var mysql = require("/usr/local/lib/node_modules/mysql");  //引入mysql模块
// ......省略12行代码见上代码块对应部分
/**
  * 创建HTTP服务器
  */
  http.createServer(function(req, res) {
    connection.query("select * from userInfo;", function(error, rows, fields) {
      res.writeHead(200, {"Content-Type":text/html;charset=utf8"});
      res.write("<h3>测试 Node.js-MySQL 数据库查询操作</h3><br/>");
      res.end(JSON.stringify(rows));
    });
  }).listen(6868);  // 监听6868端口号

插入MySQL数据库操作

console.log("------ mysql insert() ------");
console.info();
var http = require("http");  // 引入HTTP模块
var mysql = require("/usr/local/lib/node_modules/mysql");  //引入mysql模块
//......此处省略连接数据库代码,可参考本章节
  connection.query('insert into userinfo(id, name, pwd) values(7, "genius", "12345678");', 
    function(errorinsert, resinsert) {
      if(errorinsert)  console.log(errorinsert);
      console.log("INSERT Return ==> ");
      console.log(resinsert);
    }
  );
//......此处省略连接数据库代码,可参考本章节

删除MySQL数据库操作

console.log("------ mysql delete() ------");
console.info();
var http = require("http");  // 引入HTTP模块
var mysql = require("/usr/local/lib/node_modules/mysql");  //引入mysql模块
//......此处省略连接数据库代码,可参考本章节
  connection.query('delete from userinfo where id=7;', function(errordelete, resdelete) {
    if(errordelete) console.log(errordelete);
    console.log("DELETE Return ==>");
    console.log(resdelete);
  });
//......此处省略连接数据库代码,可参考本章节

更新MySQL数据库

console.log("------ mysql update() ------");
console.info();
var http = require("http");  // 引入HTTP模块
var mysql = require("/usr/local/lib/node_modules/mysql");  //引入mysql模块
//......此处省略连接数据库代码,可参考本章节
  connection.query('update userinfo set pwd="87654321" where pwd="12345678";', 
    function(errorupdate, resupdate) {
      if(errorupdate) console.log(errorupdate);
      console.log("Update Return ==>");
      console.log(resupdate);
    }
  );
//......此处省略连接数据库代码,可参考本章节

操作MySQL数据库连接池

console.log("------ mysql pool() ------");
console.info();
var http = require("http");  // 引入HTTP模块
var mysql = require("/usr/local/lib/node_modules/mysql");  //引入mysql模块
//......省略12行代码,见建立数据连接部分
/**
  * 创建HTTP服务器
  */
  http.createServer(function(req, res) {
  /**
    * 获取数据库连接池
    */
  pool.getConnection(function(err, conn) {
    if(err) {
      console.log("POOL ==> " + err);
      console.log();
    }
    /**
      * 定义SQL查询语句
      * @type {string}
      */
    var selectSQL = 'select * from userinfo';
    /**
      * 执行数据查询操作
      */
      conn.query(selectSQL, function(err, rows) {
        if(err) {
          console.log(err);
          console.log();
        }
        console.log("SELECT ==> ");
        for(var i in rows) {
          console.log(rows[i]);
        }
        conn.release();  // 释放数据库连接
        res.writeHead(200, {"Content-Type": "text/html;charset=utf8"});
        res.write("<h3>测试 Node.js  - MySQL 数据库连接池操作!</h3><br/>");
        res.end(JSON.stringify(rows));
      });
    });
  }).listen(6868);  // 监听6868端口号

Node异步I/O与Async流程控制库

1. Node框架异步I/O机制
2. Node框架异步I/O应用
3. Async流程控制库

Node框架异步I/O机制基础

console.inf("/n");
console.info('------ Node异步编程:基础初步! ------');
console.inf("/n");
// 使用setTimeout()异步方法初探异步机制
setTimeout(function() {
  console.log('async - print it now');  // 在回调函数内输出信息
}, 3000);
console.log("asyn - print it 3 second later!");  // 异步方法后输出信息
console.inf("/n");
console.inf("------ Node异步编程 ------");
console.inf("/n");

Node框架异常捕获机制

console.info('------ Node异步编程:异常捕获! ------');
setTimeout(function() {
  try {
    var data = b/0;  //错误的计算
  } catch(e) {
    console.log(e);
  }
}, 1000);
console.info();

Async串行流程控制

console.info('------ Node异步编程:Async series Array');
console.info();
var async = require("async"); // 引用'async'包
/**
  * 使用series函数方法
  */
async.series([
  function(callback) {
    callback(null, 'hello');
  },
  function(callback) {
    callback(null, 'async');
  },
  function(callback) {
    callback(null, 'series');
  }
], function(err, results) {
  console.log(results);
});
console.info();
console.info('------ Node异步编程:Async series ------');
console.info('------ Node异步编程:Async series Json ------');
console.info();
var async = require('async');  // 引用'async'包
/**
  * 使用series函数方法
  */
async.series({
  one: function(callback) {
    callback(null, "hello");
  },
  two: function(callback) {
    callback(null, "async");
  },
 three: function(callback) {
    callback(null, "series");
  },
}, function(err, results) {
    console.log(results);
});
console.info();
console.info('------ Node异步编程: Async series Json ------');
说明:在应用Async流程控制库过程中,async.series()函数完全严格按照串行执行的,它完成的是同步操作的功能。

Async瀑布模式流程控制(串行)

console.info('------ Node异步编程:Async waterfall ------');
console.info();
var async = require('async');  // 引用'async'包
/**
  * 使用waterfall函数方法
  */
async.waterfall([
  function(callback) {
    // 回调函数的第一个参数为非空值时,waterfall会停止执行剩余任务
    callback(null, 1);
  },
  function(data, callbackl) {
    console.info(data);
    callback(‘test’, 2);
  },
  function(data, callback) {
    console.info(data);
    callback(null, 3);
  }
], function(err, results) {
  console.log(results);
});
console.info();
console.info('------ Node异步编程:Async waterfall ------');

Async并行流程控制

console.info('------ Node异步编程:Async parallel ------');
console.info();
var async = require('async');  // 引用'async'包
/**
  * 使用parallel函数方法
  */
  async.parallel([
    function(callback) {
      setTimeout(function() {
        callback(null, 'one');  
      }, 2000);
    },
    function(callback) {
      setTimeout(function() {
        callback(null, 'two');  
      }, 1000);
    }
  ],
  function(err, results) {
    console.log(results);
  });
  console.info();
  console.info('------ Node异步编程:Async parallel ------');

Async限制性并行流程控制

console.info('------ Node异步编程:Async parallelLimit ------');
console.info();
var async = require('async');  // 引用'async'包
/**
  * 使用parallelLimit函数方法
  */
async.parallelLimit([
  function(callback) {
    setTimeout(function() {
      callback(null, 'one');
    }, 1000);
  },
   function(callback) {
     setTimeout(function() {
        callback(null, 'two');
      }, 1000);
  }
],
1,
function(err, results) {
  console.log(results);
));
console.info();
console.info('------ Node异步编程:Async parallelLimit ------');

Async循环流程控制

console.info('------ Node异步编程:Async whilst ------');
console.info();
var async = require('async');
var count = 0;
/**
  * Define JSON Array
  * @type {{name:string, age:number}[]}
  */
var list = [
  {name:'Jack', age:20},
  {name:'Lucy', age:18},
  {name:'Jack', age:20},
  {name:'Lucy', age:18},
  {name:'Lucy', age:18}
];
async.whilst() {
  function() {
    return count < 5;
  },
  function(callback) {
    console.log(count);
    list[count].age += 1;
    count++;
    setTimeout(callback, 1000);
  },
  function(err) {
    console.log(count);
    console.log(list);
  }
};
console.info();
console.info('------ Node异步编程:Async whilst ------');
console.info('------ Node异步编程:Async doWhilst ------');
console.info();
var async = require('async');
var count = 0;
/**
  * Define JSON Array
  * @type {{name:string, age:number}[]}
  */
var list = [
  {name:'Jack', age:20},
  {name:'Lucy', age:18},
  {name:'Jack', age:20},
  {name:'Lucy', age:18},
  {name:'Lucy', age:18}
];
async.doWhilst{
  function(callback) {
    console.log(count);
    list[count].age += 1;
    count++;
    setTimeout(callback, 1000);
  },
  function() {return count < 5},
  function(err) {
    console.log(list);
  }
};
console.info();
console.info('------ Node异步编程:Async doWhilst ------');

Async队列流程控制

console.info('------ Node异步编程:Async queue ------');
console.info();
var async = require('async');
/**
  * 定义一个queue,设worker数量为2
  */、
var q = async.queue(function(task, callback) {
  console.log('worker is processing task:', task.name);
}, 2);
/**
  * 独立加入5个任务
  */
q.push({name: 'foo'}, function(err) {
  console.log('finished processing foo');
});
q.push({name: 'bar'}, function(err) {
  console.log('finished processing bar');
});
q.push({name: 'cap'}, function(err) {
  console.log('finished processing cap');
});
q.push({name: 'egg'}, function(err) {
  console.log('finished processing egg');
});
q.push({name: 'app'}, function(err) {
  console.log('finished processing app');
});
/**
  * listen: 当最后一个任务交给worker时,将调用该函数
  */
q.empty = function() {
  console.log('no more tasks waiting');
}
/**
  * listen: 当所有任务都执行完以后,将调用该函数
  */
q.drain = function() {
  console.log('all tasks have been processed');
}
注意:相对于async.parallel()函数而言,async.queue()函数在很多关键点提供了回调处理,而且pusj新任务的功能也是async.parallel()函数所做不到的,由此可见async.queue()函数的并行处理能力更为强大。

Node Web开发

围绕以下方面:

1. HTTP模块方法与应用
2. HTTPS模块方法与应用
3. Express开发框架应用

构建一个基本的HTTP服务器

console.info("------ http - create basic server ------");
console.info();
var http = require('http');  // 引入http模块
/**
  * 调用http.createServer()方法创建服务器
  */
http.createServer(function(req, res){
  /**
    * 通过res.writeHeader()方法写HTTP文件头
    */
  res.writeHeader(200, {'Content-type' : 'text/html'});
  /**
    * 通过res.write()方法写页面内容
    */
  res.write('<h3>Node.js-HTTP</h3>');
   /**
    * 通过res.end()方法发送响应状态码,并通知服务器消息完成
    */
    res.end('<p>Create Basic HTTP Server</p>');
}).listen(6868);  // 监听6868端口号
说明:当第一次调用response.write()方法时,将会发送缓存的header信息和第一个报文给客户端。当第二次调用response.write()方法时,Node框架假设用户将发送数据流,然后分别地进行发送。意味着响应是缓存到第一次报文的数据块。如果response.write()方法的所有数据被成功刷新到内核缓冲区,则返回true。如果所有或部分数据还处在队列中,则返回false。当缓冲区再次被释放时,drain事件会被分发。

编写一个简单的HTTP客户端

console.info('------ http-create basic client ------');
console.info();
var http = require('http');  // 引入http模块
/**
  * 定义服务器参数字段
  * @type {{hostname: string, port: number, path: string, method: string}}
  */
var options = {
  hostname: 'localhost',  // 定义服务器主机地址
  port: 6868,  // 定义服务器主机端口号
  path: '/',  // 定义服务器路径
  method: 'POST' // 定义服务器访问方式
};
/**
  * 通过http.request()方法
  * 由客户端向HTTP服务器发起请求
  */
var req = http.request(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  res.setEncoding('utf8');
  res.on('data', function(chunk) {
    console.log('BODY:' + chunk);
  });
});
/**
  * 监听request对象的'error'事件
  */
req.on('error', function(e) {
  console.log('problme with request: ' + e.message);
});
/**
  * write data to request body
  */
req.write('data/n');
/**
  * write end to request body
  */
req.end();
console.info('------ http - create basic server ------');
console.info();
var http = require('http');  // 引入http模块
// 调用http.createServer()方法创建服务器
http.createServer(function(req, res) {
  // 通过res.writeHeader()方法写HTTP文件头
  res.writedHeader(200, {'Content-Type' : 'text/html'}),
  // 通过res.write()方法写页面内容
  res.write('<h3>Node.js -- HTTP</h3>');
  // 通过res.end()方法响应状态吗,并通知服务器消息完成
  res.end('<p>Create Basic HTTP Server Response to clients request</p>');
}).listen(6868);  // 监听6868端口号
---------------------------------------
####HTTP响应状态码
```javascript
console.info("------ http - create basic client ------");
console.info();
var http = require('http');  // 引入http模块
var querystring = require('querystring');  // 引入Query String模块
/**
  * 定义响应状态码数据
  */
var status_codes = new Array();
status_codes[0] = "201";
status_codes[1] = "202";
status_codes[2] = "203";
status_codes[3] = "401";
status_codes[4] = "402";
/**
  * 定义查询字段
  */
var postData = new Array();
for(var n = 0; n < 5; n++) {
  postData[n] = querystring.stringify({
    statuscodes: status_code[n]
  });
}
/**
  * 模拟HTTP客户端向HTTP服务端连续发送request请求
  */
for(var i = 0; i < 5; i++) {
/**
  * 定义服务器参数字段
  * @type {{hostname: string, port: number, path: string, method: string, headers: {Content-Type: string, Content-Length: *}}}
  */
  var options = {
    hostname: 'localhost',
    port: 6868,
    path: '/' + postData[i],
    method: 'POST',
    header: {
        'Content-Type': 'application/x-www-form-urlencode',
        'Content-Length': postData.length
    }
  };
/**
  * 通过http.request()方法
  *  由客户端向HTTP服务器发起请求
  */
var req = http.requets(options, function(res) {
  console.log('STATUS_CODES:' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  console.info();
  res.setEncoding('utf8');
  res.on('data', function(chunk) {
    console.log('BODY: ' + chunk);
    console.info();
  });
});
/**
  * 监听request对象的'error'事件
  */
req.on(''error', function(e) {
  console.log('problem with request: ' + e.message);
  console.info();
})
/**
  * write data to request body
  */
req.write("/n");
/**
  * write end to request body
  */
req.end();
};
console.info("------ http STATUS_CODES");
console.info();
var http = require('http);  // 引入http模块
console.log("Now start HTTP server...");
console.info();
/**
  * 调用http.createServer()方法创建服务器
  */
http.createServer(function(req, res) {
  var status = req.url,substr(1);  // 获取url查询字段
  var status_codes = status.substring(12);  // 获取HTTP.STATUS_CODES
  // 判断http.STATUS_CODES响应状态码集合是否有效
  if(!http.STATUS_CODES[status_codes]) {
    status_codes = '404';
  }
  // 通过res.writeHeader()方法写HTTP文件头
  res.writeHeader(status_codes, {'Content-Type':'text/plain'});
  // 通过res.end()方法发送响应状码,并通知服务器消息完成
  res.end(http.STATUS_CODES[status_codes]);
}).listen(6868);  // 监听6858端口号

设定和获取HTTP头文件

console.log("------ http - server write header ------");
console.info();
/**
  * 调用http.createServer()方法创建服务器
  */
http.createServer(function(req, res) {
  /**
    * 通过res.writeHead()方法写HTTP文件头
    */
  res.writeHead(200, {
    'Content-Length' : body.length,
    'Content-Type' : ‘text/plain’
  });
  /**
    * 通过res.write()方法写页面内容
    */
  res.write("Node.js");
  res.write("HTTP");
  /**
    * 通过res.end()方法发送响应状态码, 并通知服务器消息完成
    */
  res.end();
}).listen(6868);  // 监听6868端口号
console.info("------ http - client write header ------");
console.info();
var http = require('http');  // 引入http模块
  /**
    * 定义服务器参数字段
    * @type {{hostname : string, port : number, path : string, method : string}}
    */
var options = {
  hostname: 'localhost',  // 定义服务器主机地址
  port: 6868,  // 定义服务器主机端口号
  path: '/',  // 定义服务器路径
  method: 'POST'  // 定义服务器访问方式
};
/**
  * 通过http.request()方法
  * 由客户端向HTTP服务器发起请求
  */
var req = http.request(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  res.setEncoding('utf8');
  res.on('data', funcition(chunk) {
    console.log('BODY: ' + chunk);
  });
});
// 监听request对象的'error'事件
req.on('error', function(e) {
  console.log('problem with request: ' + e.message);
});
req.write('data/n');
re.end();

发送与处理GET请求

console.info("------ http - client get ------');
console.info();
var http = require('http');  // 引入http模块
/**
 * 发送HTTP GET请求
 */
http.get("http://localhost:6868/signature=12345678&echostr=78787878&timestamp=168",
  /**
   * GET回调函数
   * @param res
   */
  function(res) {
    console.log('STATUS: ' + res.statusCode); // 打印输出Status_Codes响应状态码
    console.info();
    /**
     * 监听"data"事件处理函数
     */
    res.on('data', function(chunk) {
      console.log('BODY:' + chunk);
      console.info();
    });
    console.info();
  }).on('error',
    /**
     * "error"事件回调函数
     * @param e
     */
    function(e) {
      console.log("Got error: " + e.message); // 打印出error信息
      console.info();
    }
  );
console.info("------- http - server get ------");
console.info();
var http = require('http'); // 引入http模块
var url = require('url'); // 引入url模块
var qs = require('querystring');  // 引入querystring模块
/**
 * 调用http.createServer()方法创建服务器
 */
http.createServer(function(req, res) {
  /**
   * 通过res.writeHeader()方法写HTTP文件头
   */
  res.writeHeader(200, {'Content-Type' : 'text/plain'});
  /**
   * 通过url.parese()方法获取查询字段
   */
  var query = url.$.parseXML(req.url).query;
  console.info(query);
  console.info();
  /**
   * 通过res.end()方法发送响应状态码,并通知服务器消息完成
   */
  var qs_parse = qs.$.parseXML(query);
  console.info(qs_parse);
  console.info();
  res.end(JSON.stringify(qs_parse));
}).listen(6868);  // 监听6868端口号

进行重定向操作

console.info("------ http - create redirect server A ------");
console.info();
var http = require('http'); // 引入http模块
console.log('Now start HTTP server on port 6868...');
console.info();
/**
 * 调用http.createServer()方法创建服务器
 */
http.createServer(function(req, res) {
  /**
   * 通过res.writeHeader()方法写HTTP文件头
   */
  res.writeHeader(301, {
    'Loaction': 'http://localhost:8686'
  });
  /**
   * 通过res.write()方法写页面内容
   */
  res.write('<h3>Node.js --- HTTP</h3>');
  /**
   * 通过res.end()方法发送响应状态吗,并通知服务器消息完成
   */
  res.end('<p>Create Redirect HTTP Server on Port 6868!</p>');
}).listen(6868);  // 监听6868端口号
console.info("------ http - create redirect server ------");
console.info();
var http = require('http'); // 引入http模块
console.log('Now start HTTP server on 8686...');
console.info();
/**
 * 调用http.createServer()方法创建服务器
 */
http.createServer(function(req, res) {
  // 通过res.writeHeader()方法写HTTP文件头
  res.writeHeader(200, {'Content-type': 'text/html'});
  // 通过res.write()方法写页面内容
  res.write('<h3>Node.js - HTTP</h3>');
  //  通过res.end()方法发送响应状态吗,并通知服务器消息完成
  res.end('<p>Create Redirect HTTP Server on Port 8686!</p>');
}).listen(8686);  // 监听8686端口

服务器多路径处理方式

console.info("------ http - server pathname ------");
console.info();
var http = require('http'); // 引入http模块
var url = require('url'); //  引入url模块
console.log('Now start HTTP server on port 6868...');
console.info();
/**
 * 调用http.createServer()方法创建服务器
 */
http.createServer(function(req, res) {
  /**
   * 获取url.pathname路径
   * @type{path|*|req.pathname|parseTests.pathname|parseTestWithQueryString}
   */
  var pathname = url.parse(req.url).pathname;
  /**
   * Responding to multi type of request
   */
  if(pathname === '/') {
    /**
     * 通过res.writeHeader()方法写HTTP文件头
     */
    res.writeHeader(200, {
      'Content-Type': 'text/plain'
    });
    /**
     * 通过res.end()方法响应状态码,并通知服务器消息完成
     */
    res.end('Home Page/n');
  } else if(pathname === '/about') {
    /**
     * 通过res.writeHeader()方法写HTTP文件头
     */
     res.writeHeader(200, {
       'Content-Type': 'text/plain'
     });
     /**
      * 通过res.write()方法写页面内容
      */
     res.write('Node.js - HTTP/n');
     /**
      * 通过res.end()方法发送响应状态码。并通知服务器消息完成
      */
     res.end('About Us/n');
  } else if(pathname === '/redirect') {
    /**
     * 通过res.writeHeader()方法写HTTP文件头
     */
    res.writeHeader(301, {
      'Location': '/'
    });
    /**
     * 通过res.end()方法发送响应状态码,并通知服务器消息完成
     */
    res.end();
  } else {
    /**
     * 通过res.writeHeader()方法写HTTP文件头
     */
    res.writeHeader(404, {
      'Content-Type': 'text/plain'
    });
    /**
     * 通过res.write()方法写页面内容
     */
    res.write('Node.js - HTTP/n');
    /**
     * 通过res.end()方法发送响应状态码,并通知服务器消息完成
     */
    res.end('Page not found/n');
  }
}).listen(6868);  // 监听6868端口号

模拟ping命令连接服务器

console.info("------ http -client ping ------");
console.info();
var http = require('http'); // 引入http模块
console.log("Now start ping HTTP server...");
console.info();
var http = require('http'); // 引入http模块
console.log("Now start ping HTTP server...");
console.info();
/**
 * 定义查询字段
 */
var options = {
  host: 'localhost',
  port: 6868,
  path: '/'
};

/**
 * 自定义函数 ping_server()
 */
function ping_server() {
  /**
   * 发送HTTP GET请求
   */
  http.get(options. function(res) {
    if(res.statusCode == 200) {
      console.log("The site is up!");
    }
    else {
      console.log('The site is down!');
    }
  }).on('error', function(e) {
    console.log("There was an error: " + e.message);
  });
}
/**进行重定向操作的方法
 * 通过setInterval()方法设定时间间隔
 */
setInterval(ping_server, 1000);
console.info("------ http - server ping ---");
console.info();
var http = require('http'); // 引入http模块
console.log("Now start HTTP server...");
console.info();
/**
 * 调用http.createServer()方法创建服务器
 */
http.createServer(function(req, res) {
  // 通过res.writeHeader()方法写HTTP文件头
  if(Math.round(Math.random())) {
    res.writeHeader(200, {'Content-Type': 'text/html'});
  } else {
    res.writeHeader(404, {'Content-Type': 'text/html'});
  }
  // 通过res.end()方法发送响应状态码,并通知服务器消息完成
  res.end();
}).listen(6868);  // 监听6868端口号
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,382评论 25 707
  • 在知识大爆炸的时代,如何让我们的阅读更加高效,更加有针对性是我们每个人都要面临的问题,有没有觉得很多时候看到读完一...
    觞咏阅读 162评论 1 3
  • By Alan Hankinson 翻译:百度贴吧ID 吾乃乱臣贼子 与众不同(1765-1840) 麦克唐纳是最...
    Baidu拿破仑吧阅读 1,285评论 0 1
  • 有些人,一直没机会见。等有机会见了,却又犹豫了,相见不如不见。 有些事,一别竟是一辈子,一直没机会做。等有机会了,...
    亚茹_我是阿茹阅读 113评论 1 0