Table of Contents generated with DocToc
在app.js中设置路由
var routes = require('./routes/index');
var users = require('./routes/users');
app.use('/', routes); //根目录的路由由/routes/index.js控制
app.use('/users', users); // /users以及之后的路由都由/routes/users.js控制路由层面
var express = require('express');
var router = express.Router();
// routes/index.js
routes.get('/', function(req, res, next) {
res.render('index', {
title: 'index'
});
})
module.exports = router;
// routes/users.js
routes.get('/', function(req, res, next) {
res.render('users/home', {
title: 'home'
});
})
routes.get('/login', function(req, res, next) { // 对应 /users/login
res.render('users/login', {
title: 'login'
});
})
module.exports = routes;- 重定向
res.redirect([status,] path);
// Redirects to the URL derived from the specified path, with specified status, a positive integer that corresponds to an HTTP status code . If not specified, status defaults to “302 “Found”.path可以是相对路径或绝对路径
// 重定向到上一页
res.redirect('..');
// or
res.redirect('back');使用重定向时注意,如果报错说不能发送headers( Can’t set headers after they are sent ),那么应该 return res.redirect()而不是直接使用它
-
Can’t set headers after they are sent不能发送headers因为已经发送过一次了在处理HTTP请求时,服务器会先输出响应头,然后再输出主体内容 一旦输出过一次响应头(比如执行过
res.writeHead()或res.write()或res.end()),你再尝试通过res.setHeader()或res.writeHead()来设置响应头时(有些方法比如res.redirect()会调用res.writeHead()),就会报这个错误express中的
res.header()相当于res.writeHead(),res.send()相当于res.write()
- extends
jade文件中通过block XX输出可扩展的块
doctype html
html
head
block head
meta(charset="utf-8")
block title
title= title
link(rel='stylesheet', href='/assets/public.bundle.css')
body
block content
script(src='/assets/public.bundle.js')上例输出head块,同时head块中的title块也是可扩展的
基础模板的时候,通过直接block XX,在其之后写入的内容会覆盖模板块中的内容,同时还有另外两种方法:
block append XX 在块内部的后面追加内容,不覆盖原有内容
block prepend XX在块内部的前面追加内容,不覆盖原有内容
extends ./extends/common_layout.jade
block title
title= (title)
block append head
link(rel='stylesheet', href='/assets/index.bundle.css')
block append content
include includes/SideBar/index.jade
#index_body
script(src='/assets/index.bundle.js')- layout
- GET
// send a GET req
$.ajax({
url: '/post?name=' + userName,
type: 'get',
success: (data) => {
// do something
},
error: (error) => {
// do something
}
});
// route
route.get('/get', function(req, res) {
// finish & send data
res.josn({success: 1})
});- POST
// 添加 body-parser 中间件以获取post的参数
$ npm install body-parser --save
// app.js
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());- POST 普通类型参数 ( name=XX&age=XX )
// route.js
route.post('/post', (req, res) {
var name = req.body.name;
var age = req.body.age;
// do something
res.send({})
});
// 前端demo.js
$.ajax({
url: '/post',
type: 'POST',
dataType: 'json',
data: 'name=ecmadao&age=24',
success: (data) => {
// do something
},
error: (data) => {
// do soimething
}
});- POST 多层嵌套的JSON数据
express为什么不能解析ajax post 上来的数据?
// 在上面app.js配置body-parser的基础上
// demo.js
$.ajax({
url: '/postData',
type: 'post',
dataType: 'json',
data: {
data: JSON.stringify(data)
},
success: (data) => {
// do something
},
error: (error) => {
// do something
}
});
// route.js
route.get('/postData', function(req, res) {
data = JSON.parse(req.body.data); // 转为JSON格式
// do something
})- 根据
_id更新/查询数据
var ObjectId = require('mongodb').ObjectID;
find({
"_id": ObjectId("1111111")
}).sort({
time: -1
}).toArray((err, doc) => {});
update({
"_id": ObjectId("222222") // 查询
}, {
$set: {
content: "new content" // 更新的键值对
}
}, (err, doc) => {});- 关于
ObjectIdObjectId