nodejs与Express4配合搭建网站

来源:互联网 发布:传世登陆器源码 编辑:程序博客网 时间:2024/06/08 04:49

最近用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 的值
0 0
原创粉丝点击