# Connect

Connect 是一个基于HTTP服务器的工具集,成为中间件(middleware)。

中间件,其实就是一个简单的JavaScript函数。除了处理req和res对象之外,还接受一个next函数来做流控制。

# 一个简单的网站

初始化:

var http = require('http');
var connect = require('connect');
var serveStatic = require('serve-static');
var path = require('path');

var app = connect();

app.use(serveStatic(path.join(__dirname, 'public-optimized')))
app.use(serveStatic(path.join(__dirname, 'public')))

// respond to all requests
app.use(function(req, res){
  res.end('Hello from Connect!\n');
});

//create node.js http server and listen on port
http.createServer(app).listen(3000);

中间件的使用,模拟登录登出:

var http = require('http');
var connect = require('connect');
var morgan = require('morgan');
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var session = require('express-session');

var users = require('./config/users.json');

var app = connect();

// logger
app.use(morgan('dev'));

// parse an HTML body into a string
app.use(bodyParser());

app.use(cookieParser());

app.use(session({
  secret: 'my site secret'
}));

app.use(function(req, res, next) {
  if('/' == req.url && req.session.logged_in) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end(`Welcome back, <b>${req.session.name}</b><a href="/logout">Logout</a>`);
  } else {
    next();
  }
});

app.use(function(req, res, next) {
  if('/' == req.url && 'GET' == req.method) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end([
      '<form method="POST" action="/login">',
        '<h1>Login</h1>',
        '<fieldset>',
          '<label>Please log in</label>',
          'Username: <input type="text" name="user" /><br>',
          'Password: <input type="password" name="password" />',
          '<p><button>Submit</button></p>',
        '</fieldset>',
      '</form>'
    ].join(''));
  } else {
    next();
  }
});

app.use(function(req, res, next) {
  if('/login' == req.url && 'POST' == req.method) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    if(!users[req.body.user] || req.body.password != users[req.body.user].password) {
      res.end('Bad username/password<br><a href="/">Back</a>');
    } else {
      req.session.logged_in = true;
      req.session.name = users[req.body.user].name;
      res.end('Success!');
    }
  } else {
    next();
  }
});

app.use(function(req, res, next) {
  if('/logout' == req.url) {
    req.session.logged_in = false;
    res.writeHead(200);
    res.end('Logged out!');
  } else {
    next();
  }
})

//create node.js http server and listen on port
http.createServer(app).listen(3000);
Last Updated: 5/22/2020, 5:01:49 PM