1. 程式人生 > >nodejs之express4x

nodejs之express4x

lan 學習 500錯誤 ace htm pre http服務 eva 12px

學習node好榜樣!前陣子看了php,那個模塊化編譯真的好棒。然而php學習起來不是一般的記不住,畢竟和js還是有不同的。於是轉移到了node。看到熟悉的js腳本,心裏踏實多了。

話不多講,php我也是要駕馭的,只是要排到後面去了。今天先來個基於node的框架之express4的模板實例

官網api:http://www.expressjs.com.cn/4x/api.html

1.首先,全局安裝。

npm install -g [email protected]

2.檢測安裝結果

express --version

3.創建項目,這裏我選擇d盤node文件夾,安裝框架模板。

express -e nodeDemo

4.進入項目安裝依賴

cd nodeDemo && npm install

5.運行項目,如果不知道運行命令是啥,打開項目根目錄下‘package.json’文件,查看scripts對象裏默認第一個的屬性名,這個模板裏叫start。

npm start

6.運行之後,打開項目根目錄下的bin文件夾裏的www.js,查看這一句代碼:‘var port = normalizePort(process.env.PORT || ‘3000‘);’3000就是端口號。基於node服務器本機ip原則。在瀏覽器輸入。

localhost:3000 或者 127.0.0.1:3000

7.項目結構

bin, 存放啟動項目的腳本文件
node_modules, 存放所有的項目依賴庫。
public,靜態文件(css,js,img)
routes,路由文件(MVC中的C,controller)
views,頁面文件(Ejs模板)
package.json,項目依賴配置及開發者信息
app.js,應用核心配置文件

8.app.js核心文件說明

// 加載依賴庫,原來這個類庫都封裝在connect中,現在需地註單獨加載
var express = require(‘express‘);
var path = require(‘path‘);
var favicon = require(‘serve-favicon‘);
var logger = require(‘morgan‘);
var cookieParser = require(‘cookie-parser‘);
var bodyParser = require(‘body-parser‘);
// 加載路由控制
var index = require(‘./routes/index‘);
var users = require(‘./routes/users‘);
// 創建項目實例
var app = express();

// // 定義EJS模板引擎和模板文件位置,也可以使用jade或其他模型引擎比如html
app.set(‘views‘, path.join(__dirname, ‘views‘));
app.set(‘view engine‘, ‘ejs‘);
//如果選用html模版就把下面的註釋並打開把上面這句註釋即可。
/*
 app.engine(‘.html‘, ejs.__express);
 app.set(‘view engine‘, ‘html‘);
*/

// uncomment after placing your favicon in /public// 定義icon圖標
//app.use(favicon(path.join(__dirname, ‘public‘, ‘favicon.ico‘)));
// 定義日誌和輸出級別
app.use(logger(‘dev‘));
// 定義數據解析器
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// 定義cookie解析器
app.use(cookieParser());
// 定義靜態文件目錄
app.use(express.static(path.join(__dirname, ‘public‘)));
// 匹配路徑和路由
app.use(‘/‘, index);
app.use(‘/users‘, users);

// catch 404 and forward to error handler//404錯誤
app.use(function(req, res, next) {
  var err = new Error(‘Not Found‘);
  err.status = 404;
  next(err);
});

// error handler//500錯誤
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get(‘env‘) === ‘development‘ ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render(‘error‘);
});
// 輸出模型app
module.exports = app;

  

9.查看./bin/www文件。

#!/usr/bin/env node

/**
 * 依賴加載
 */

var app = require(‘../app‘);
var debug = require(‘debug‘)(‘nodedemo1:server‘);
var http = require(‘http‘);

/**
 * 定義啟動端口.
 */

var port = normalizePort(process.env.PORT || ‘3000‘);
app.set(‘port‘, port);

/**
 * 創建HTTP服務器實例
 */

var server = http.createServer(app);

/**
 * 啟動網絡服務監聽端口
 */

server.listen(port);
server.on(‘error‘, onError);
server.on(‘listening‘, onListening);

/**
 * 端口標準化函數
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * HTTP異常事件處理函數
 */

function onError(error) {
  if (error.syscall !== ‘listen‘) {
    throw error;
  }

  var bind = typeof port === ‘string‘
    ? ‘Pipe ‘ + port
    : ‘Port ‘ + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case ‘EACCES‘:
      console.error(bind + ‘ requires elevated privileges‘);
      process.exit(1);
      break;
    case ‘EADDRINUSE‘:
      console.error(bind + ‘ is already in use‘);
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * 事件綁定函數
 */

function onListening() {
  var addr = server.address();
  var bind = typeof addr === ‘string‘
    ? ‘pipe ‘ + addr
    : ‘port ‘ + addr.port;
  debug(‘Listening on ‘ + bind);
}

  

10.編輯views/index.ejs文件

這裏就是前臺展示的頁面了。可以使用我們熟悉框架啊之類的。文件類型是ejs的,如果想用熟悉的html的,需要在app.js裏修改一下就好,我已經在上面代碼中寫清楚了註釋。

11.重點來了,我夢寐以求的模塊化網站:把index.ejs頁面切分成3個部分:header.ejs, index.ejs, footer.ejs,用於網站頁面的模塊化。

編輯header.ejs。註意結構!

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <title><%= title %></title>
    <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.2/css/bootstrap.min.css">
    <link rel=‘stylesheet‘ href=‘/stylesheets/style.css‘ />
  </head>
  <body>

  

編輯footer.ejs。

<script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
    <script src="http://cdn.bootcss.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
  </body>
</html>

  

編輯index.ejs。

<% include header.ejs %>

<div class="well jumbotron">
<h1><%= title %></h1>
<p>This is a simple hero unit, a simple jumbotron-style component for calling extra attention to featured content or information.</p>
<p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
</div>

<% include footer.ejs %>

  重新啟動項目,刷新頁面就會看到結果了。

這裏需要註意,如果你的模塊組件放在了其他文件夾下 那麽引入的命令裏是可以加路徑的,如果你換成了html模板的話,記得把引入命令也修改了。比如:<% include ./psge/header.html %>

至於路由啊還有更高層次的就到官網上看api吧http://www.expressjs.com.cn/4x/api.html

入門到此結束。

<% include header.ejs %>

<div class="well jumbotron">
<h1><%= title %></h1>
<p>This is a simple hero unit, a simple jumbotron-style component for calling extra attention to featured content or information.</p>
<p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
</div>

<% include footer.ejs %>

nodejs之express4x