nodejs后端框架Express
1. Express 与 Koa
使用Node.js
开发后端,最流行的框架有Express
和Koa
。其中
这么简单的对比一下,我们就选择 Express。
2. 创建 Express 项目
正式开发Express
项目,我们在工作中,一般不会自己手动一点点创建项目文件。而是使用express-generator
脚手架,通过它,一个命令就会自动生成项目所需要的结构了。
那么现在先来安装:
npm i -g express-generator@4
注意下,我们需要使用-g
参数,来全局安装它。
现在还需要一个专门来放项目的地方。使用 macOS,那么推荐大家可以放在家目录的Developer
文件夹下。如果你还没有这个文件夹的话,可以使用这个命令来创建它,并进入其中
mkdir ~/Developer && cd ~/Developer
Windows 的同学,找一个自己熟悉的目录就好。但请务必注意,路径中不要有中文,不能有空格,否则在开发中,有可能会出现各种奇怪的错误。建好目录后,一样需要在命令行中,通过cd
命令,进入其中
接着就要来创建项目了。
express --no-view clwy-api && cd clwy-api
这里要注意,我们使用了--no-view参数
,它的意思是不需要任何视图模板,因为我们这个项目专门做后端接口的。将来渲染页面会使用Vue
和React
之类的框架,所以不需要视图。然后我们项目的名字叫做clwy-api
项目创建成功后,通过命令,安装依赖包。
npm i
这样项目所需要的依赖包,都会自动下载到项目之中了
最后,运行命令,启动服务
npm start
现在就可以通过 http://localhost:3000,来访问我们的第一个项目了。
这时候会看到欢迎页面,恭喜你,到这里,你已经成功的跑起来Node.js
了。
3. 输出 json
继续来改,我们这个项目是专门开发接口的,而接口所需要的是json
格式,而不是直接输出HTML
。
那么找到routes/index.js
文件,将中间这行改为
router.get('/', function (req, res, next) {
res.json({ message: 'Hello Node.js' });
});
它的意思就是以json
格式来输出 Hello Node.js
这时候我们刷新浏览器,会发现它没有任何变化,还是显示以前的内容。这是因为当修改代码后,Express
并没有一直监听我们的修改,运行的一直是之前的东西。想要显示最新修改的内容,需要重启服务。
回到命令行,按ctrl + c
键,可以停止服务,接着再次运行npm start
来启动服务。接着还要删掉public/index.html
文件。刷新浏览器后,可以看到返回的json
数据了
4. nodemon 监听修改
做到这里,大家也发现了,当我们修改代码后,你不重启服务,它根本就不会生效。但是我们开发中,需要不断的修改代码,那要不停的重启,岂不是非常麻烦?
当然也有办法解决啦,可以安装一个叫做nodemon
的包来解决这个小问题。按ctrl + c
停止服务后,运行
npm i nodemon
然后打开项目根目录下的package.json
,将start
这里修改为
"scripts": {
"start": "nodemon ./bin/www"
},
改完后,我们再次启动服务
npm start
先来刷新一下,确定看到的是Hello Node.js
。然后马上来修改routes/index.js
,
router.get('/', function (req, res, next) {
res.json({ message: 'Hello 长乐未央' });
});
无需重启,我们直接刷新,可以看到显示的内容,已经变成:Hello 长乐未央
了
5. 总结一下
命令 | 说明 |
---|---|
npm i -g express-generator@4 | 安装 express-generator |
express --no-view 项目名 | 创建 Node.js 项目 |
- 开发
Node.js
项目,要先安装express-generator
,这样才能使用命令,创建项目 - 创建项目的命令是
express --no-view
加上项目名
- 后端接口所使用的格式是:
json
,而不是:HTML
- 还要给项目安装、配置
nodemon
,这样Express
才能监听你的代码
6. 项目结构
bin/www
在package.json
中,大家见过这个文件的配置。它是用来启动项目的文件,无需修改,也不用管它,知道它是干嘛的就好了。
node_modules
展开后,会发现里面有非常多的文件。这就是当我们使用npm i
命令后,安装的项目依赖包。我们也不用管它,甚至将它们删掉都没关系。因为当你再次运行npm i
后,它又会重新出现的。
public 目录
这里放的各种静态资源,例如 CSS、图片等等静态资源。但因为我们项目是专门开发接口的,所以这里的东西,大家完全不需要管它,根本用不上。
routes
这里是程序的路由部分,路由简单的理解就是将不同网址,分别对应到不同的程序代码上去。咱们开发项目,最重要的就是这个目录了,后面我们开发要写的代码主要也都是在这里。
app.js
这个文件也很重要,在开发中,我们需要做一些路由的配置、跨域配置,都会来修改它的。
package.json
这里主要记录的是项目的基本信息,和一些依赖包的情况。
package-lock.json
最后一个是package-lock.json
,它是用来锁定npm i
时,安装依赖包的版本号。并且将代码发给其他人后,保证其他人在npm i
时,所使用的依赖包版本号能一致。这个文件删掉后,运行npm i
也会自动重新生成的。
所以我们在开发中,目前要关注的就是router 目录
和 app.js
,其他文件都无需理会。
7. 代码解析
再来看routes/index.js
,
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function (req, res, next) {
res.json({ message: 'Hello 长乐未央' });
});
module.exports = router;
7.1. var、let、const
一眼看过去,如果你也用的WebStorm
,那么你会发现代码中的var
,都会有灰色的波浪线。鼠标放上去后,会提示:'var' is used instead of 'let' or 'const',说推荐使用ES 6
里面的let
或者const
来代替var
。那么我们可以用编辑器的查找替换功能,来将它们全部改为const
。macOS 里按command + r
,使用 windows 就按ctrl + r
,查找var
,并替换成const
。再点击 Replace All
这样就简简单单的处理好了。
上面两行就是引入express
,定义了路由 (router),路由就是用来设置访问地址的。它可以将不同的访问地址,与一个个不同的方法对应起来。
7.2. 简单的了解一下路由
接着重要的来了,这就是路由了
router.get('/', function (req, res, next) {
res.json({ message: 'Hello 长乐未央' });
});
注意看,这里有个get
。get
是请求的一种,我们后面还有碰到其他的请求。get
请求大家就简单的理解成,用户访问浏览器了。get
后面是/
,这是访问地址的路径。
可以尝试做一个修改,将/
改为/hello
router.get('/hello', function (req, res, next) {
res.json({ message: 'Hello 长乐未央' });
});
现在刷新页面,浏览器会提示你 Cannot GET /
,接着我们访问 http://localhost:3000/hello,又会正确的显示内容了。
同样的,你希望通过其他的路径访问当前方法,那么直接修改这里就可以轻松实现了,这就是路由的作用
7.3. req、res 和 next
接着这里有个function
,它就是当前路由/hello
访问后,所对应的,要运行的函数。它里面有三个参数,分别是:req
、res
和next
。
req
req
是Request
的缩写,也就是请求
的意思。通过req
,我们可以获取到用户通过URL
,或者表单传递给我们的数据。例如用户提交了一个关于注册的表单,我们就可以从req
中取出用户提交的数据,从而进一步存入到数据库中,保存起来。现在请先稍等一下,后面我们很快就会学习到相关的知识了。
res
res
是Response
的缩写,也就是响应
的意思。通过res
,我们可以对用户的请求做出响应。例如这里的
res.json({ message: 'Hello 长乐未央' })
它的意思就是,当用户访问了 /hello
后,要通过json
这种格式,显示一段欢迎信息给用户看。这样用户的浏览器上才能正确的显示数据啊。
next
最后的next
,没错,它就是下一步
的意思。它允许我们在当前函数中对请求进行一些处理,然后再传递给下一个函数。我们这里并没有用到它,关于这里的知识,需要将来在实现登录功能的时候,才会碰到。如果我们当前方法中用不到next
,当然也可以直接删掉它。
7.4. 导出模块
最底部的module.exports = router
,这是Node.js
中一种导出模块的方式。在所有的路由文件中,你都将见到这一行,而这是必须存在的。因为只有这样写了以后,app.js
中,才能正确的引用到我们当前的路由文件
var indexRouter = require('./routes/index');
既然打开了 app.js 文件,同样的,那就再来一个查找替换吧,将var
,一次性都替换成const
,这样就更符合ES 6
的语法要求了。
- 目前开发中,只需要关注
routes 目录
和app.js 文件
就好了,其他的都不用管它。 - 路由的作用,就是让浏览器的访问地址,与代码段对应起来
- 推荐使用
ES 6
语法,用const
、let
来代替var
8. Sequelize ORM 的使用
那么,现在我们就来一起玩玩Sequelize ORM
。第一步当然是要来安装了。先安装sequelize
的命令行工具,需要全局安装,这样更方便使用
npm i -g sequelize-cli
接着确保命令行是在当前项目的命令行里,还要安装当前项目所依赖的sequelize
包和对数据库支持依赖的mysql2
npm i sequelize mysql2
最后,来初始化项目。
sequelize init
.
├── config
│ └── config.json
├── migrations
├── models
│ └── index.js
└── seeders
在编辑器中,也可以看到项目中新增了这些东西,现在一一看看,它们是用来干嘛的。
- config:是配置的意思,这里放的也就是
sequelize
所需要的连接数据库的配置文件。 - migrations:是迁移的意思,如果你需要对数据库做新增表、修改字段、删除表等等操作,就需要在这里添加迁移文件了。而不是像以前那样,使用客户端软件来直接操作数据库。
- models:这里面存放的是模型文件,当我们使用
sequelize
来执行增删改查时,就需要用这里的模型文件了。每个模型都对应数据库中的一张表。 - seeders,是存放的种子文件。一般会将一些需要添加到数据表的测试数据存在这里。只需要运行一个命令,数据表中就会自动填充进一些用来测试内容的了。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。