基本概念
Node.js作为一个服务端脚本语言,不像.net或者java一样需要iis这样的web服务器,它本身实现了这个功能。
Node.js是单进程单线程应用程序,由事件驱动,收到一个请求后直接放到事件队列中,然后继续等待请求,而不是收到请求后立即执行。然后由事件处理程序来执行回调函数。
初始代码
const http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
}).listen(8233);
访问网址http://localhost:8233
代码解析
const http = require('http');
nodejs中用require命令引入模块,此处引入http模块。
http.createServer(function (request, response) {
}).listen(8233);
http模块的createServer方法创建一个web服务器,然后用listen方法决定监听的端口。
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
writeHead是写响应头,end发送响应内容。
代码演进:nodejs的路由,处理url
在一个正常的服务器程序中,基本不可能像我们上面那样只返回一个helloworld。
往往需要根据url的不同来返回响应的信息。
这里我们输出请求的url:
const http = require('http');
http.createServer((request, response) => {
response.writeHead(200, { 'Content-Type': 'text/plain' });
response.write(`url: ${request.url}`);
response.end();
}).listen(8233);
访问网址http://localhost:8233/insert/abc?id=1&name=1输出结果:
url: /insert/abc?id=1&name=1
这里我们需要解析请求的url,解析一个字符串还是比较简单的,这里就不需要我们去做了,nodejs有专门的模块去处理。
修改代码为:
const http = require('http');
const url = require('url');
const querystring = require('querystring');
http.createServer((request, response) => {
const urlInfo = url.parse(request.url);
response.writeHead(200, { 'Content-Type': 'text/plain' });
response.write(`url: ${request.url}\n`);
response.write(`pathname: ${urlInfo.pathname}\n`);
response.write(`query: ${urlInfo.query}\n`);
const queryInfo = querystring.parse(urlInfo.query);
response.write(`id: ${queryInfo.id}`);
response.end();
}).listen(8233);
输出结果为:
url: /insert/abc?id=1&name=1
pathname: /insert/abc
query: id=1&name=1
id: 1
代码演进:对路由的处理
const http = require('http');
const url = require('url');
const querystring = require('querystring');
const db = {
users: [],
};
const router = (pathname, queryInfo) => {
switch (pathname) {
case '/add':
db.users.push({
id: db.users.length + 1,
name: queryInfo.name,
});
break;
case '/delete':
db.users = db.users.filter(l => l.id.toString() !== queryInfo.id);
break;
default:
break;
}
};
const getDbInfo = () => db.users.reduce(
(pre, next) => `${pre}id:${next.id} name:${next.name}\n`,
'',
);
http.createServer((request, response) => {
const urlInfo = url.parse(request.url);
response.writeHead(200, { 'Content-Type': 'text/plain' });
const queryInfo = querystring.parse(urlInfo.query);
router(urlInfo.pathname, queryInfo);
response.write(getDbInfo());
response.end();
}).listen(8233);
在这里
通过http://localhost:8233/add?name=troy这样的路径增加数据
通过http://localhost:8233/delete?id=1这样的路径删除数据
代码演进:模块化处理
一般的服务器不可能将所有的代码写在一个文件里,那么这里将上面的代码划分为不同的模块。
代码结构如下:
db.js:
/**
* 数据管理
*/
const db = {
users: [],
};
exports.getDbInfo = () => db.users.reduce(
(pre, next) => `${pre}id:${next.id} name:${next.name}\n`,
'',
);
exports.deleteData = (id) => {
db.users = db.users.filter(l => l.id.toString() !== id);
};
exports.addData = (name) => {
db.users.push({
id: db.users.length + 1,
name,
});
};
router.js
/**
* 路由分配
*/
const db = require('./db');
const route = (pathname, queryInfo) => {
switch (pathname) {
case '/add':
db.addData(queryInfo.name);
break;
case '/delete':
db.deleteData(queryInfo.id);
break;
default:
break;
}
};
exports.route = route;
server.js
/**
* 服务器设置
*/
const http = require('http');
const url = require('url');
const querystring = require('querystring');
const router = require('./router');
const db = require('./db');
http.createServer((request, response) => {
const urlInfo = url.parse(request.url);
response.writeHead(200, { 'Content-Type': 'text/plain' });
const queryInfo = querystring.parse(urlInfo.query);
router.route(urlInfo.pathname, queryInfo);
response.write(db.getDbInfo());
response.end();
}).listen(8233);
小结
通过搭建一个简单的Node.js服务器,了解了nodejs的服务器搭建,模块化处理,路由处理的一些简单玩法。算是对Node.js有了一个初步的了解。