Express in Action读书笔记
5 路由
5.4 静态路由
指定某个目录为静态目录:
var publicPath = path.resolve(__dirname, "public");
app.use(express.static(publicPath));
指定某个目录为静态目录,并设置别名:
var photoPath = path.resolve(__dirname, "offensive-photos-folder");
app.use("/offensive", express.static(photoPath));
指定多个目录为静态目录:
var publicPath = path.resolve(__dirname, "public");
var userUploadsPath = path.resolve(__dirname, "user_uploads");
app.use(express.static(publicPath));
app.use(express.static(userUploadsPath));
5.5 使用HTTPS
因为没涉及,没做深入研究,这块大概是利用OpenSSL生成一个私钥:
openssl genrsa -out privatekey.pem 1024
openssl req -new -key privatekey.pem -out request.pem
然后在代码里使用:
var express = require("express");
var https = require("https");
var fs = require("fs");
var app = express();
// ... define your app ...
var httpsOptions = {key: fs.readFileSync("path/to/private/key.pem"), cert: fs.readFileSync("path/to/certificate.pem")
};
https.createServer(httpsOptions, app).listen(3000);
HTTP与HTTPS同时使用:
var express = require("express");
var http = require("http");
var https = require("https");
var fs = require("fs");
var app = express();
// ... define your app ...
var httpsOptions = {key: fs.readFileSync("path/to/private/key.pem"),cert: fs.readFileSync("path/to/certificate.pem")
};
http.createServer(app).listen(80);
https.createServer(httpsOptions, app).listen(443)
5.6 实战
书中展示的是根据邮编(美国)获取当前温度的示例。可以根据实际情况改成根据城市获取天气等。略。。
5.7 总结(略)
6 创建API
6.2 简单的JSON API示例
创建JSON API的一般方法:解析请求、设置HTTP状态码、返回JSON串。
app.get("/random/:min/:max", function(req, res) {var min = parseInt(req.params.min); var max = parseInt(req.params.max); if (isNaN(min) || isNaN(max)) { res.status(400); res.json({ error: "Bad request." }); return; } var result = Math.round((Math.random() * (max - min)) + min); res.json({ result: result });
});
6.3 CRUD API
常用的HTTP请求方法:GET、POST、PUT、DELETE。使用方式:
var express = require("express");
var app = express();
app.get("/", function(req, res) {res.send("you just sent a GET request, friend");
});
app.post("/", function(req, res) {res.send("a POST request? nice");
});
app.put("/", function(req, res) {res.send("i don’t see a lot of PUT requests anymore");
});
app.delete("/", function(req, res) {res.send("oh my, a DELETE??");
});
app.listen(3000, function() {console.log("App is listening on port 3000");
});
6.4 API的版本
考虑到以后会对API进行升级,而又不想影响别人调用,对API进行版本标识。
var express = require("express");
var apiVersion1 = require("./api1.js");
var apiVersion2 = require("./api2.js");
var app = express();
app.use("/v1", apiVersion1);
app.use("/v2", apiVersion2);
app.listen(3000, function() {
console.log("App started on port 3000");
});
6.5 HTTP状态码
HTTP status ranges in a nutshell:
1xx: hold on
2xx: here you go
3xx: go away
4xx: you messed up
5xx: I messed up
6.5.1 设置状态码
设置状态码并返回JSON串:
res.status(404).json({ error: "Resource not found!" });
还可以这样设置状态码:
res.statusCode = 404;
6.5.2 100段状态码
100段状态码只有两个,一般也用不到:
100:Continue
101:Switching Protocols
6.5.3 200段状态码
常用的四个:
200:OK
201:CREATED
202:ACCEPTED
204:NO CONTENT
6.5.4 300段状态码
常用的三个:
301: MOVED PERMANENTLY
303: SEE OTHER
307: TEMPORARY REDIRECT
6.5.5 400段状态码
常用的三个:
401:UNAUTHORIZED,未认证/未授权
403:FORBIDDEN,禁止访问
404:NOT FOUND,最常见的,找不到资源
6.5.6 500段状态码
500: Internal Server Error,最常见的,系统内部错误
7 视图与模板
7.1 Express视图的特点
使用其他格式进行渲染:
Express默认使用HTML进行视图渲染,如果要使用其他格式,可以使用res.type进行修改:
app.get("/", function(req, res) {res.type("text");res.render("myview", {currentUser: "Gilligan"});
});
7.1.3 Consolidate.js:让所有视图引擎与Express兼容使用
Consolidate.js是一个可以将许多视图引擎与Express兼容使用的库。有些视图引擎,比如Walrus,Express并不支持,使用Consolidate.js可以很好的解决这个问题。安装完Walrus和Consolidate之后(npm install walrus consolidate),就可以在Express中使用了。
var express = require("express");
var engines = require("consolidate");
var path = require("path");
var app = express();app.set("view engine", "wal");
app.engine("wal", engines.walrus);
app.set("views", path.resolve(__dirname, "views"));app.get("/", function(req, res) { res.render("index");
});
app.listen(3000);
7.2 EJS
7.3 PUG
Pug的前身是Jade,由于一些法律的原因,不能再使用Jade这个名字了,就改成了Pug。
8 使用Mongodb存储数据
8.1 为什么是Mongodb
主要介绍Mongodb和Mongodb的工作原理以及Mongodb的安装,略。
8.2 Mongoose
Mongoose provides a straight-forward, schema-based solution to modeling
your application data and includes built-in type casting, validation, query
building, business logic hooks and more, out of the box.
8.2.1 创建项目
为了学习该主题,第8章是以一个项目案例LAM(Learn About Me)形式介绍的。
8.2.2 创建用户模型
Mongo是以一种二进制的格式BSON来存储所有数据的。一个简单的Hello World BSON文档可能是这样的:
\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00
但这不是人能看懂的,为了能够理解,于是就有了数据库模型这个概念。在Node中,我们的模型就是JavaScript对象。
在Mongoose中,我们需要使用一个schema来定义模型。
var mongoose = require("mongoose");var userSchema = mongoose.Schema({username:{type:String, required:true,unique:true},password:{type:String,required:true},createdAt:{type:Date,default:Date.now},displayName:String,bio:String
});//创建并导出用户模型
var User = mongoose.model("User",userSchema);
module.exports = User;
8.2.3使用模型
之后就是例子的实战,各个文件的代码就不贴了,在操作过程中发现好像8.3中的代码在这节出现了,出现以下异常:
Error: Unknown authentication strategy "login"
at attempt (F:\myprog\nodejs\node-exercise\node_modules\passport\lib\middleware\authenticate.js:173:37)
at authenticate (F:\myprog\nodejs\node-exercise\node_modules\passport\lib\middleware\authenticate.js:349:7)
at Layer.handle [as handle_request] (F:\myprog\nodejs\node-exercise\node_modules\express\lib\router\layer.js:95:5)
at next (F:\myprog\nodejs\node-exercise\node_modules\express\lib\router\route.js:131:13)
at model.
at next_ (F:\myprog\nodejs\node-exercise\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:89:34)
at fnWrapper (F:\myprog\nodejs\node-exercise\node_modules\mongoose\node_modules\hooks-fixed\hooks.js:186:18)
at F:\myprog\nodejs\node-exercise\node_modules\mongoose\lib\model.js:291:13
at F:\myprog\nodejs\node-exercise\node_modules\mongoose\lib\model.js:226:5
at F:\myprog\nodejs\node-exercise\node_modules\mongoose\lib\model.js:135:7
at F:\myprog\nodejs\node-exercise\node_modules\mongoose\node_modules\mongodb\lib\collection.js:504:5
at F:\myprog\nodejs\node-exercise\node_modules\mongoose\node_modules\mongodb\lib\collection.js:666:5
at handleCallback (F:\myprog\nodejs\node-exercise\node_modules\mongoose\node_modules\mongodb\lib\utils.js:96:12)
at F:\myprog\nodejs\node-exercise\node_modules\mongoose\node_modules\mongodb\lib\bulk\unordered.js:473:9
at handleCallback (F:\myprog\nodejs\node-exercise\node_modules\mongoose\node_modules\mongodb\lib\utils.js:96:12)
at resultHandler (F:\myprog\nodejs\node-exercise\node_modules\mongoose\node_modules\mongodb\lib\bulk\unordered.js:420:5)
而事实上login是在8.3中才出现的,建议连着8.3一起继续练习完再来看运行效果。
附录,一些有用的模块
- Sequelize
- Lodash,一个工具类库
- Async
- Request
- Gulp
- node-canvas
- Sinon.JS
- Zombie.js
- Supererror
更多的可以参考下列网址: - Awesome Node.js by Sindre Sorhus
- Eduardo Rolim’s list of the same name
- Node Weekly
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
