npm在package.json文件中管理项目的依赖项以及项目的元数据。要创建这个文件,最简单的办法是运行npm init:它会问一系列的问题,然后为你生成一个package.json文件帮你起步,如下图
安装express:
npm install --save express
(--save用于更新package.json)
因为node_modules随时都可以用npm重新生成,所以我们不会把这个目录保存在我们的代码库中
创建一个.gitignore文件:
# ignore packages installed by npm
node_modules
# put any other files you don't want to check in here,
# such as .DS_Store (OSX), *.bak, etc.
创建配置文件config.js:
创建入口文件server.js:
var app = require('express')();
//配置文件
var config = require('./config.js');
//禁用Express的X-Powered-By头信息
app.disable('x-powered-by');
//添加通用中间件
//请求体中间件
app.use(require('body-parser')());
//静态资源目录(存放css、js、图片文件等静态资源)
app.use(express.static(__dirname +'/public'));
//设置端口号(如果配置了环境端口,会优先选择)
app.set('port', process.env.PORT || config.port);
//视图模版设置
var handlebars=require('express-handlebars').create({
defaultLayout:'main',//默认公共模版
extname:'.hbs',//文件后缀名
helpers:require('./helper.js').helpers()//辅助函数
});
app.engine('hbs',handlebars.engine);
app.set('view engine','html');
//监听端口
app.listen(app.get('port'),function(){
console.log('Express started on http://localhost:'+app.get('port') +'; press Ctrl-C to terminate.');
});
//如果需要使用子域名,可以使用vhost(npm install --save vhost)
//创建子域名"admin"......它应该出现在所有其他路由之前varadmin = express.Router();
app.use(vhost('admin.*', admin));
//创建admin的路由;它们可以在任何地方定义admin.get('/',function(req, res){
res.render('admin/home');
});
admin.get('/users',function(req, res){
res.render('admin/users');
});
//路由分组
require('./routers.js')(app);
// 定制404页面
app.use(function(req, res){
res.type('text/plain');
res.status(404);
res.send('404 - Not Found'+config.name);
});
// 定制500页面
app.use(function(err, req, res, next){
console.error(err.stack);
res.type('text/plain');
res.status(500);
res.send('500 - Server Error');
});
创建路由分组文件routers.js:
默认忽略了大小写或反斜杠,并且在进行匹配时也不考虑查询字符串
//引入控制器
var home = require('./controllers/home.js');
var about = require('./controllers/about.js');
//提供接口
module.exports = function(app){
//home
app.get('/',home.home);
//about
app.get('/about',about.about)
//带参数的路由
app.get('/abou/:city/:name',about.city);
//正则表达式路由
1.用同一个路由处理/和/home
app.get('/(home)?, home.home');
2.完整的正则表达式
app.get(/crazy|mad(ness)?|lunacy/,function(req,res){});
//因为路由的本质也是中间件,所以还可以这样写
app.get('/about',function(req,res,next){
if (...) return next();//走向下一个中间件,这里就是about.about
return res.send('...');//结束返回,不会向下走,render,json一样
}, about.about);
}
创建控制器文件home.js、about.js:
exports.home = function(req,res,next){
res.render('home', {
title: '主页',//传递参数
layout:null,//不使用默认模版
//还可以重写辅助方法...
})
}
exports.about = function(req,res,next){...}
创建数据库主文件db.js:
npm install --save mongoose
var mongoose=require('mongoose');
var config=require('../config.js');
//连接数据库
mongoose.connect(config.db,{server: {poolSize:20, socketOptions:{keepAlive:1}}},function(err) {if(err) {process.exit(1);}});
require('./admin/coal');
exports.Coal=mongoose.model('Coal');//导出模型
...
//如果使用云托管,MongoLab:https://npmjs.org/package/mongodb
然后将数据库凭证添加到config.js文件里:
mongo: {
development: {connectionString: 'your_dev_connection_string',},
production: {connectionString: 'your_production_connection_string',},
}
//连接
var opts = {server: {socketOptions: { keepAlive: 1 }}};
switch(app.get('env')){
case 'development':
mongoose.connect(credentials.mongo.development.connectionString, opts);break;
case 'production':
mongoose.connect(credentials.mongo.production.connectionString, opts);break;
default:throw newError('Unknown execution environment: ' + app.get('env'));
}
创建模型文件:
var helper=require('../helper.js');//封装数据库公共方法
var mongoose=require('mongoose');
var CoalSchema=new mongoose.Schema({
supplier: String,
water: {type:String,default:'123'//默认值}
});
CoalSchema.statics.getCoal=function(callback){this.find(callback);}
//导出
module.exports=mongoose.model('Coal',CoalSchema);
不写了,太多了。。。