Nodejs相关
...
Nodejs相关
概念和作用
Node.js 是⼀个开源与跨平台的 JavaScript 运行时环境。 它是⼀个可⽤于⼏乎任何项⽬的流行工具。Node.js 可以在浏览器外运⾏ V8 JavaScript引擎(Google Chrome 的内核)。Node.js 使得js除了客户端代码之外还可以编写服务器端代码。
总结下来有如下特点:
- Node.js 应⽤程序运⾏于单个进程中,⽆需为每个请求创建新的线程。Node.js 中的库通常是使⽤⾮阻塞的范式编写的。
- 当 Node.js 执⾏ I/O 操作时会在响应返回时恢复操作,⽽不是阻塞线程并浪费 CPU 循环等待。这使 Node.js 可以在⼀台服务器上处理数千个并发连接,⽽⽆需引⼊管理线程并发的负担。
- 在 Node.js 中可以使⽤新的 ECMAScript 标准。不必等待所有⽤户更新其浏览器,你可以通过更改 Node.js 版本来决定要使⽤的 ECMAScript 版本。
Web服务器搭建
http.createServer
创建http对象,传入一个回调函数用于处理请求,具体格式如下:
const http = require('http');
const onRequest = (request, response) => {
console.log('Request received');
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello from server');
}
const server = http.createServer(onRequest);
server.listen(3000, '127.0.0.1');
console.log('Server started on port 3000');
路由写法
路由效果是根据不同的地址返回不同的数据。为了项目结构清晰、松耦合,分四个模块:
- app.js - 核心逻辑,最外层写在这里,但是不包含实现细节;
- server.js - 放服务端的创建逻辑;
- router.js - 这个文件放路由的处理,即它要解决不同路径都调那些回调函数;
- handler.js - 所有回调函数的细节。
// app.js
var server = require('./server');
var router = require('./router');
var handler = require('./handler');
var handle = {};
handle["/"] = handler.home;
handle['/home'] = handler.home;
handle['/review'] = handler.review;
handle['/api/v1/records'] = handler.api_records;
server.startServer(router.route, handle);
// server.js
var http = require('http');
var fs = require('fs');
function startServer(route, handle) {
var onRequest = function(request, response) {
console.log('Request received ' + request.url);
route(handle, request.url, response); // 具体处理写在router里
}
var server = http.createServer(onRequest);
server.listen(3000, '127.0.0.1');
console.log('Server started on localhost port 3000');
}
module.exports.startServer = startServer;
// router.js
var fs = require('fs');
function route(handle, pathname, response) {
console.log('Routing a request for ' + pathname);
if (typeof handle[pathname] === 'function') {
handle[pathname](response);
} else {
response.writeHead(200, { 'Content-Type': 'text/html' });
fs.createReadStream(__dirname + '/404.html', 'utf8').pipe(response);
}
}
module.exports.route = route;
// handler.js
var fs = require('fs');
function home(response) {
response.writeHead(200, { 'Content-Type': 'text/html' });
fs.createReadStream(__dirname + '/index.html', 'utf8').pipe(response);
}
function review(response) {
response.writeHead(200, { 'Content-Type': 'text/html' });
fs.createReadStream(__dirname + '/review.html', 'utf8').pipe(response);
}
function api_records(response) {
response.writeHead(200, { 'Content-Type': 'application/json' });
var jsonObj = {
name: "itbaizhan"
};
response.end(JSON.stringify(jsonObj));
}
module.exports = {
home: home,
review: review,
api_records: api_records
}
get和post请求区分
if (request.method === "POST")