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遇到的问题

注意:即通过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遇到的问题

 

通过 Express 应用生成器创建的应用一般都有如下目录结构:

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 ,如下:

express遇到的问题

即这里的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");
});
View Code

相关文章: