nodejs+express+express-handlbars+mongoose

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);


不写了,太多了。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容