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. (F:\myprog\nodejs\node-exercise\node_modules\mongoose\lib\document.js:1861:20)
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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部