1. const http = require('http');
  2. const hostname = '127.0.0.1';
  3. const port = 3000;
  4. const server = http.createServer((req, res) => {
  5. res.statusCode = 200;
  6. res.setHeader('Content-Type', 'text/plain');
  7. res.end('Hello, World!\n');
  8. });
  9. /**
  10. 注意,设置了 hostname 就只开放对应的hostname访问了哦
  11. Linux 可以使用 netstat -ntpl检查端口开放情况
  12. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  13. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1380/sshd
  14. tcp 0 0 127.0.0.1:3000 0.0.0.0:* LISTEN 1794/node
  15. tcp6 0 0 :::80 :::* LISTEN 3019/node
  16. tcp6 0 0 :::22 :::* LISTEN 1380/sshd
  17. */
  18. server.listen(port, hostname, () => {
  19. console.log(`Server running at http://${hostname}:${port}/`);
  20. });
  1. const http = require('http');
  2. function addCookie(res, { name, value, expireHours }){
  3. var cookieString=name+"="+escape(value);
  4. //判断是否设置过期时间
  5. if(expireHours > 0){
  6. var date = new Date();
  7. date.setTime(date.getTime+expireHours*3600*1000);
  8. cookieString = cookieString+"; expire="+date.toGMTString();
  9. }
  10. const cookies = res.getHeader('Set-Cookie');
  11. cookies.push(cookieString);
  12. res.setHeader('Set-Cookie', cookies);
  13. }
  14. function getQuery(req) {
  15. const search = {};
  16. (req.originalUrl.split('?').slice(1) || []).forEach(item => {
  17. const [key, value] = item.split('=');
  18. search[key] = value;
  19. })
  20. console.log(search);
  21. return search;
  22. }
  23. const server = http.createServer((req, res) => {
  24. console.log(req instanceof http.IncomingMessage); // true
  25. res.setHeader('Content-Type', 'text/html');
  26. res.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);
  27. const contentType = res.getHeader('content-type');
  28. // 'text/html'
  29. console.log(contentType)
  30. addCookie(res, {name: "ljy998", value: "999", expireHours: 30})
  31. const cookies = res.getHeader('set-cookie');
  32. // ['type=ninja', 'language=javascript']
  33. console.log(cookies)
  34. // Object
  35. console.log(typeof cookies)
  36. // 每次用户请求都会进入此方法。
  37. // http://127.0.0.1:3000/index.html?abc=666
  38. // /index.html?abc=666 GET undefined undefined undefined
  39. res.end(`${req.url} ${req.method} ${req.query} ${req.params} ${req.body}`);
  40. });
  41. server.on('clientError', (err, socket) => {
  42. socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
  43. });
  44. server.listen(3000, function(){
  45. console.log("web service start, port 3000")
  46. });

use 的实现demo

  1. const http = require('http');
  2. function call(handle, route, err, req, res, next) {
  3. var arity = handle.length;
  4. var error = err;
  5. var hasError = Boolean(err);
  6. try {
  7. if (hasError && arity === 4) {
  8. // error-handling middleware
  9. handle(err, req, res, next);
  10. return;
  11. } else if (!hasError && arity < 4) {
  12. // request-handling middleware
  13. handle(req, res, next);
  14. return;
  15. }
  16. } catch (e) {
  17. // replace the error
  18. error = e;
  19. }
  20. // continue
  21. next(error);
  22. }
  23. const proto = {};
  24. proto.handle = function handle(req, res) {
  25. var index = 0;
  26. var stack = this.stack;
  27. function next(err) {
  28. var layer = stack[index++];
  29. var route = layer.route;
  30. call(layer.handle, route, err, req, res, next);
  31. }
  32. next();
  33. }
  34. proto.use = function use(route, fn) { // 支持只传入一个fn
  35. var handle = fn;
  36. var path = route;
  37. // default route to '/'
  38. if (typeof route !== 'string') { // 支持只传入一个fn
  39. handle = route;
  40. path = '/';
  41. }
  42. if (path[path.length - 1] === '/') {
  43. path = path.slice(0, -1);
  44. }
  45. this.stack.push({ route: path, handle: handle });
  46. }
  47. function createServer() {
  48. function app(req, res, next){
  49. // 首次的时候没有next, next = undefined
  50. console.log(req.url)
  51. app.handle(req, res, next);
  52. }
  53. app.use = proto.use;
  54. app.handle = proto.handle;
  55. app.route = '/';
  56. app.stack = [];
  57. return app;
  58. }
  59. const app = createServer()
  60. app.use(function(req, res, next) {
  61. res.__fn = function () {
  62. console.log("__fn")
  63. return 'hello world'
  64. }
  65. next()
  66. })
  67. app.use(function(req, res, next) {
  68. const result = res.__fn()
  69. res.end(result)
  70. })
  71. // http.createServer(fn) 中的 fn 所有的http请求都会进入这个方法
  72. const server = http.createServer(app)
  73. server.listen(3000, function(){
  74. console.log("web service start, port 3000")
  75. });