nodejs与Express4配合搭建网站

最近用nodejs和Express试了一下搭建网站,感觉速度还是相当快的,总结一下,好记性不如烂笔头!

node的安装可以直接到官网下载最新版本,安装就好。
node安装好后我们来依次安装,其中-g表示全局安装,好处是可以直接在命令行里输入。-v可以查看相应轮子的版本,不过express的查看版本命令要用-V。

npm install
npm uninstall

-express安装

因为用的是版本四,所以输入下方语句进行安装:

npm install -g express

-supervisor—-每次修改代码后会自动重启。懒程序员就指望这种省事省力的工具活着了:)

npm install -g supervisor

接下来就可以用Express创建项目了。
先进入自己想建立工程的目录下,然后输入下方命令

express -e nodejs-project

这里说下express的一些简单命令:

  • -h, –help output usage information
  • -V, –version output the version number
  • -e, –ejs add ejs engine support (defaults -j –jade)
    –hbs add handlebars engine support
  • -H, –hogan add hogan.js engine support
  • -

就可以看到该目录下自动建立了相应的文件夹,但是这个时候还没有建立完成哦!需要继续输入:

npm install

它会根据配置文件package.json自动安装相应的包,并把它们放进node_modules文件夹下。
这个时候就可以启动服务了,在命令行下输入:

node ./bin/www/

supervisor ./bin/www/

然后在浏览器中打开就可以看到久违的hello了!


默认端口为3000。

接下来说一下内部代码:
Express4改变了目录结构
- bin目录:有一个www文件,而这个就是开始文件,这样就可以理解我们的启动语句了!
- node_modules: 存放项目的依赖库;
- package.json: 项目依赖配置及开发者信息,可以看文档了解详细信息;
- public: 静态文件如 css,js,img;
- routes: 路由文件(这是攻城重点);
- Views: 页面文件(Ejs或者jade的模板,默认是jade);

为了使express能够识别我已经习惯的html文档,这里我建立了基于Ejs模板的架构。这样将其中的app.set('view engine', 'ejs');改为app.engine('.html', ejs.__express);app.set('view engine','html');就可以了!

app.js中的代码:

// 创建项目实例
var app = express();
// 定义日志和输出级别
app.use(logger('dev'));
// 定义icon图标
app.use(favicon(__dirname + '/public/favicon.ico'));
// 定义日志和输出级别
app.use(logger('dev'));
// 定义数据解析器
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// 定义cookie解析器
app.use(cookieParser());
// 定义静态文件目录
// view engine setup定义页面文件的位置 __dirname是node.js中的全局变量,表示取当前执行文件的路径
app.set('views', path.join(__dirname, 'views/pages'));
//express.static( )是处理静态请求的,设置了public文件,public下所有文件都会以静态资料文件形式返回(如样式、脚本、图片素材等文件)
app.use(express.static(path.join(__dirname, 'bower_components')));
// 加载路由控制
var routes = require('./routes/index');//路由
var users = require('./routes/users');
//表示当用户使用/访问时,调用routes,即routes目录下的index.js文件,其中.js后缀省略,用/users访问时,调用routes目录下users.js文件
app.use('/', routes);
app.use('/users', users);
// 404错误处理
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// 开发环境,500错误处理和错误堆栈跟踪
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// 生产环境,500错误处理
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});

bin/www文件

#!/usr/bin/env node   

/** * 依赖加载 */
var app = require('../app');
var debug = require('debug')('nodejs-demo: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)) {
    return val;
  }
  if (port >= 0) {
    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);
}

rotes/index.js中的代码:

/* GET home page. */
// router.get表示通过get请求/时,响应后面的function处理,两个参数分别是request、response
//res.render表示调用模版引擎解析名字index的模板,传并传入了title对象做为参数
router.get('/', function(req, res, next) {
  res.render('index', { title: '首页' });
});
//解释:若get请求的url为当前路径,则交给路由index入口中的对应函数处理
app.get('/', routes.index);

其中一些方法的解释:

  • app.set(name, value)和app.get(name)就是你想的那样,set()为设置 name 的值设为 value,get()为获取设置项 name 的值

你可能感兴趣的:(JavaScript,网站,express,nodejs)