1. 如何引入express?
cnpm install express --save
其中--save可以保存到依赖项中。
接着 var express = require("express"); 即可。这里express只是一个模块。
注意: 有时候我们会看到有人使用 npm i express --save 的方式来安装,这样也是可行的,因为 npm i 就是 npm install 的简写形式。
2. 什么是并且如何使用express-generator?
这是一个生成express的生成器,通过它,我们可以快速构建一个express架构,而无需自己繁琐的一项一项构建。
cnpn install express-generator -g (管理员方式打开命令窗口)
注意:如果是在当前目录安装就不需要使用管理员方式,但是如果全局安装,就一定要使用管理员方式。因为这里创建了一个生成器,所以就像构造函数一样可以去创建实例,那么express在命令行中就是相当于一个可执行文件, 如果不是全局安装,就必须要在express-generator的文件目录下才能执行 ,非常繁琐,但是如果全局安装,我们在任何目录下都可以执行该命令。 如:
express myapp
就可以创建一个express架构。
这里默认使用的模板引擎是jade,如果希望使用ejs模板引擎,可以是 npm -e myapp, 其中的-e就代表使用ejs模板引擎。
如下:
注意:即通过express-generator我们再执行 express <项目名称> 可以快速构建一个架构。 其中myapp就是这样一个文件,包含了package.json(此文件中的依赖项中包含了各种express所需的包),app.js(即入口文件)、pulic即其下面的一些文件夹用于存放相应的文件 ,以及路由等等。 如果不使用 express-generator ,我们就得自己一个一个的创建,这是相当麻烦的 。 另外,如果有不符合我们项目的地方,我们直接修改即可。 创建的同时提示首先 cd myapp (即进入myapp文件夹)然后 npm install(安装package.json中的依赖项),完成依赖项的安装(即package.json文件中的依赖项安装)。我们可以看到package.json中的依赖项如下:
{ "name": "myapp", "version": "0.0.0", "private": true, "scripts": { "start": "node ./bin/www" }, "dependencies": { "body-parser": "~1.17.1", "cookie-parser": "~1.4.3", "debug": "~2.6.3", "express": "~4.15.2", "jade": "~1.11.0", "morgan": "~1.8.1", "serve-favicon": "~2.4.2" } }
其中body-parser在post请求时必须使用;cookie-parser在处理cookie时必须使用; debug模块用于调试,类似于console.log; express就更不用说了;jade是模板引擎模块,这对于服务器端语言还是非常重要的。morgan是一个日志模块,用于在后台打印出req请求等等,方便我们在后台查看,这与debug模块非常相似,但是debug模块是用于取代console.log的,而morgan主要是用于查看请求的。serve-favicon不太懂,后面学习。
cd myapp
npm install
注意: 在安装过程中,会提示jade已经更名为pug,也就是说两者是一回事。
在安装完了所有的依赖项之后,我们就可以使用下面的命令来启动这个应用了:
set DEBUG=myapp:* & npm start
这里 set DEBUG=myapp:* & npm start 就可以来启动了,而前者是说启动debug模块,打印一些debug日志方便我们管理后台。 注意:和*之间有空格和没有空格是不同的。 这里使用的没有空格。
另外,如果不希望使用debug模块,像下面这样就可以启动了。
npm start
在浏览器中进入localhost:3000, 如下所示:
通过 Express 应用生成器创建的应用一般都有如下目录结构:
(补充):其中routes文件是怎么是使用的呢?
其实不用routes文件当然也是可以的,但是在实际开发中, 路由文件动辄成百上千,如果全部放在 app.js 中, 不难想象app.js将会多么臃肿, 所以我们需要对于不同路径的路由放在不同的文件下。
对于 express-generator 生成的模板, app.js 的内容如下:
var express = require('express'); var app = express(); var indexRouter = require('./routes/index'); var userRouter = require('./routes/users'); app.use('/', indexRouter); app.use('/users', userRouter); app.listen(3000);
然后进入routes下的index我们可以看到:
var express = require('express'); var router = express.Router(); router.get('/', function(req, res) { res.send('hello, express'); }); module.exports = router;
其中router为express.Router() 的一个实例,这是非常重要的。
对于routes下的users也是一样的:
var express = require('express'); var router = express.Router(); router.get('/:name', function(req, res) { res.send('hello, ' + req.params.name); }); module.exports = router;
这样就可以很好的管理路由了,当然,不难看出,实际项目中,我们并不是真的只要这两个路由,而是根据你的项目,可能除了 index、 users, 还有其他的文件,只要保证一个路径对应一个路由文件即可,这样便可很好地管理路由了。
重要的是需要在 app.js 中使用 app.use() 挂载到不同的路径上。
易错点: 在使用 app.use() 时,第一个参数是一个相对的路径,然后使用第二个参数,即routes下的文件时, router.get("/"),这又是一个路径,最终表现在url上是两者的综合路径(叠加路径),比如app.use('/reg', index); 其中在index下的路由文件中设置的是 router.get('/reg', function (req, res) {}) , 那么最终表现出来的就是localhost:8888/reg/reg 这样的路由,这样才能正确访问, 否则就会出错。
(补)debug模块的使用。(参考教程)
在上面的例子中,我们使用 set DEBUG=myapp:* & npm start, 其中用到了debug模块, 实际上debug模块是怎么使用的呢?
nodejs的调试有很多,这里主要介绍debug模块调试,首先npm init 、npm install debug --save, 新建app.js文件,其内容如下:
var debug = require("debug")("mydebug:http"), work = require("./work"), http = require("http"); http.createServer(function (req, res) { debug(req.method + " " + req.url); res.end("hello \n"); }).listen(3000, function () { debug("listening"); });
然后建立work.js,内容如下:
var debug = require("debug")("mydebug:work"); setInterval(function () { debug("doing some work @ %s - %s", new Date().toString(), "with supervisor"); }, 2000);
(注意:如果要debug, 就必须要在当前目录下存在 npm-debug.log 日志文件)
可以看到,这两个模块中我都使用了 debug 模块。 运行 set DEBUG=mydebug:* & node app.js ,如下:
即这里的debug语句就相当于console.log(),然后对于不同的debug,会显示不同的显色, 而mydebug是我设置的debug名称,也可以是其他的。
开启时使用的是 set DEBUG=mydebug:* & node app , 也就是说我们运行了所有的(*)debug模块,如果我们只想运行work模块,而不运行http模块,可以像下面这样:
set DEBUG=mydebug:work & node app
我们可以将&理解为并且的意思。(为什么不是&&呢?)
(补)npm start的使用原理
这里实际上是 npm run start 的简写。 参考 http://javascript.ruanyifeng.com/nodejs/packagejson.html
这里的npm start启动的是bin目录下的www,也就是说使用 express-generator 的默认的入口是 bin 下的 www, 而不是app.js ,目前很多项目都是如此, 我们可以在 package.json中进行设置,如 express-generator 中的设置如下:
{ "name": "myapp", "version": "0.0.0", "private": true, "scripts": { "start": "node ./bin/www" }, "dependencies": { "body-parser": "~1.17.1", "cookie-parser": "~1.4.3", "debug": "~2.6.3", "express": "~4.15.2", "jade": "~1.11.0", "morgan": "~1.8.1", "serve-favicon": "~2.4.2" } }
其中的 scripts 中设置了start(入口文件)为 node ./bin/www ,即当启动项目时,实际上输入的是 node ./bin/www ,只是这样设置的好处在于更加方便管理。容易理解。
比如我们创建一个文件,npm init , 创建 app.js,内容如下:
var http = require("http"); http.createServer(function (req, res) { res.writeHead(200, {"Content-Type": "text/plain; charset=utf8"}); res.write("hello"); res.end(); }).listen(8888, function () { console.log("Server is running at port 127.0.0.1:8888"); });