最近用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的一些简单命令:
就可以看到该目录下自动建立了相应的文件夹,但是这个时候还没有建立完成哦!需要继续输入:
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);
其中一些方法的解释: