前段时间参考Scott老师的教程以及相关资料,用nodejs+express+mongodb搭建了一个简单网站。功能比较简单,主要是实践nodejs还有学习使用bower、grunt等工具。
当然必不可少的是要有一定的nodejs基础,个人比较喜欢阿里团队的《七天学会NodeJS》。结合慕课网的教程,我用nodejs的http模块写了简单的爬虫。这些都是准备工作,这里主要记录一下遇到的那些坑,有些安装过程没有截图,用文字叙述。
1. 安装nodejs.
安装详见上一篇博客。
2.前期准备工作。
构建起项目要清楚项目从哪里入口,怎样运行起来,视图有哪些,页面之间怎样跳转。项目最基本的构成如下图所示。
其中app.js是入口文件, views 目录下是视图文件 , node_modules 下面是已安装和要安装 模块的存放位置。
Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架。Jade是源于Node.js的html模板引擎。这里我也是第一次使用Express和Jade。
npm install express
npm install jade
npm install bower -g
bower install bootstrap
依次执行下来安装了express、jade、bower、bootstrap。其中,bootstrap是通过bower安装的。bower用来管理前端资源。关于express和jade的具体使用请参考官方文档。
注意 我是使用sublime text3作为开发环境,jade的语法高亮需要安装插件。使用package control搜索jade,下载第一个插件即可。不使用模板的话,我一般是用emmet插件,可以快速编写html、css。
3.编写代码。
各项准备工作做好之后,要实际编写代码让项目跑起来。
入口文件app.js
var express = require('express');
var bodyParser = require("body-parser");
var mongoose = require('mongoose');
var Movie = require('./models/movie')
var User = require('./models/user')
var port = process.env.PORT || 3000;
var app = express();
mongoose.connect('mongodb://localhost/movie')
//设置视图的根目录、模块引擎
app.set('views', './views/pages');
app.set('view engine', 'jade');
//将表单数据进行格式化
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
//请求页面过来的请求中有样式文件去public中查找
app.use(express.static('public'));
app.locals.moment = require('moment');
app.listen(port);
console.log('start!' + port);
//index page
app.get('/', function(req, res) {
Movie.fetch(function(err, movies) {
if(err) {
console.log(err);
}
res.render('index', {
title: '首页',
movies: movies
})
})
})
//signup
app.post('/user/signup', function(req,res) {
})
//detail page
app.get('/movie/:id', function(req, res) {
})
//adimin page
app.get('/admin/movie', function(req, res) {
})
require进来所需要的模块,便可以使用相应的方法。通过app.get/app.post/app.delete和相应的路径分别执行get、post、delete方法。res.render通过拿到的html渲染页面。
layout.jade
doctype
html
head //页面的head,有要用到的一些head文件如bootstrap以及jquery等.每个页面都继承layout
meta(charset="utf-8")
title #{title}
include ./includes/head
body //这是页面的body,需要到相应的jade文件中访问
include ./includes/header
block content
index.jade
/*首页*/
//-继承上层目录的layout
extends ../layout
//-声明主要内容
block content
.container
.row
each item in movies
.col-md-2
.thumbnail
a(href="/movie/#{item._id}")
img(src="{item.poster}",alt="#{item.title}")
.caption
h3 #{item.title}
p: a.btn.btn-primary(href="/movie/#{item._id}", role="button") 观看预告片
其他视图的jade类似于首页。
还没有安装grunt的情况下,在项目目录运行 node app.js,打印start 3000!便成功运行在3000端口,地址栏输入localhost:3000便可以访问首页。端口可以自行修改,除了改代码,在命令行运行PORT=端口号 可以直接修改。
注意 用jade一定要注意缩进
img is self closing and should not have content
例如我遇到的这个错误,是img标签后的标签相对它有缩进,编译的时候认为它有child就不对了。
还有在head引入文件时注意引入顺序,报如下错误应该先引入JQuery。
Bootstrap’s JavaScript requires jQuery
这是最早的实现版本,还没有连通数据库。接下来会继续更新。
相关源码见https://github.com/amie0119/nodejs-movie 现已实现用户注册、登录、影片展示、添加、删除等,还在不断修改中。