当前位置: 首页 > >

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文档可能是这样的:


x16x00x00x00x02hellox00x06x00x00x00worldx00x00

但这不是人能看懂的,为了能够理解,于是就有了数据库模型这个概念。在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
odejs
ode-exercise
ode_modulespassportlibmiddlewareauthenticate.js:173:37)
at authenticate (F:myprog
odejs
ode-exercise
ode_modulespassportlibmiddlewareauthenticate.js:349:7)
at Layer.handle [as handle_request] (F:myprog
odejs
ode-exercise
ode_modulesexpresslib outerlayer.js:95:5)
at next (F:myprog
odejs
ode-exercise
ode_modulesexpresslib outer oute.js:131:13)
at model. (F:myprog
odejs
ode-exercise
ode_modulesmongooselibdocument.js:1861:20)
at next_ (F:myprog
odejs
ode-exercise
ode_modulesmongoose
ode_moduleshooks-fixedhooks.js:89:34)
at fnWrapper (F:myprog
odejs
ode-exercise
ode_modulesmongoose
ode_moduleshooks-fixedhooks.js:186:18)
at F:myprog
odejs
ode-exercise
ode_modulesmongooselibmodel.js:291:13
at F:myprog
odejs
ode-exercise
ode_modulesmongooselibmodel.js:226:5
at F:myprog
odejs
ode-exercise
ode_modulesmongooselibmodel.js:135:7
at F:myprog
odejs
ode-exercise
ode_modulesmongoose
ode_modulesmongodblibcollection.js:504:5
at F:myprog
odejs
ode-exercise
ode_modulesmongoose
ode_modulesmongodblibcollection.js:666:5
at handleCallback (F:myprog
odejs
ode-exercise
ode_modulesmongoose
ode_modulesmongodblibutils.js:96:12)
at F:myprog
odejs
ode-exercise
ode_modulesmongoose
ode_modulesmongodblibulkunordered.js:473:9
at handleCallback (F:myprog
odejs
ode-exercise
ode_modulesmongoose
ode_modulesmongodblibutils.js:96:12)
at resultHandler (F:myprog
odejs
ode-exercise
ode_modulesmongoose
ode_modulesmongodblibulkunordered.js:420:5)

而事实上login是在8.3中才出现的,建议连着8.3一起继续练*完再来看运行效果。


附录,一些有用的模块
SequelizeLodash,一个工具类库AsyncRequestGulpnode-canvasSinon.JSZombie.jsSupererror
更多的可以参考下列网址:Awesome Node.js by Sindre SorhusEduardo Rolim’s list of the same nameNode Weekly



友情链接: