express 是一个在 npm registry 里可获得的一个 Node.js 模块,在安装之前需要下载和安装 Node.js,这里推荐用 nvm 去管理 Node.js 的版本。
安装 express 需要 Node.js 0.10 版本以上,在安装之后不清楚 node 版本时可以命令行运行 node -v
命令查看 node 版本。
选择目标文件夹,进行 npm 初始化
cd myapp
npm init
一般在安装时我们会将模块依赖写到 dependencies 节点,也可以按照实际需求采取其他命令参数,详见 [npm install 的 --save、--save-dev 等相关参数](https://blog.youkuaiyun.com/wzp20092009/article/details/98850521)理解。
npm install express --save-dev
来写个例子试一试
const express = require('express'); // 版本4.17.1
const app = express();
const port = 3000;
app.get('/', (req, res) => res.send('Hello World!'));
app.listen(port, () => console.log(`Example app listening on port ${port}!`));
在命令行中用 node 运行该文件
node express-helloWorld.js
浏览器打开地址 127.0.0.1:3000
PS: express 不同的版本可能会影响代码的执行
问题一:
好多 node 的学习资料上在安装 express 之后运行例子的 js 代码可能会有如下报错
例子代码如下:
var express = require('express');
var app = express.createServer(); // 报错处,这里改就好了
app.get('/', function(req, res){
res.send('Welcome to Node Test');
});
app.listen(9000, function(){
console.log('App has running at the 127.0.0.1:9000!');
});
因为我们安装的 express 版本比这些例子上的 express 上的版本比较新,所以我们将原来创建服务器的方法 express.createServer()
改成 express()
执行就好了,这样我们就用 express()
创建了服务器 。
var express = require('express');
var app = express(); // 这么改就好了
app.get('/', function(req, res){
res.send('Welcome to Node Test');
});
app.listen(9000, function(){
console.log('App has running at the 127.0.0.1:9000!');
});
问题二:
Most middleware (like bodyParser) is no longer bundled with Express
例子代码如下:
var express = require('express');
var app = express();
app.listen(9000);
var tweets = [];
app.get('/', function(req, res){
res.send('Welcome to Node Twitter');
});
// express.bodyParser() 报错
app.post('/send', express.bodyParser(), function(req, res){
if(req.body && req.body.tweet){
tweets.push(req.body.tweet);
res.send({status: 'ok', message: 'Tweet received'});
}else{
// 没有tweet?
res.send({status: "nok", message: "No tweet received"});
}
});
app.get('/tweets', function(req, res){
res.send(tweets);
})
原因很简单,后来版本的 express 剥离了原来集成的一些组件,需要另外手动安装这些组件,并引用到项目里使用。
npm install body-parser --save-dev
在代码里通过 require 引用 body-parser 模块,使用时直接 bodyParser.urlencoded({ extended: false })
作为中间件替换原来的 express.bodyParser()
修改后代码如下:
var express = require('express');
var bodyParser = require('body-parser');
// var app = express.createServer();
var app = express();
app.listen(9000, function(){
console.log('App running at 127.0.0.1:9000');
});
var tweets = [];
app.get('/', function(req, res){
res.send('Welcome to Node Twitter');
});
// app.post('/send', express.bodyParser(), function(req, res){
app.post('/send', bodyParser.urlencoded({ extended: false }), function(req, res){
if(req.body && req.body.tweet){
tweets.push(req.body.tweet);
res.send({status:"ok", message:"Tweet received"});
}else{
// 没有tweet?
res.send({status:"nok", message:"No tweet received"});
}
})
app.get('/tweets', function(req, res){
res.send(tweets);
})
Post 请求的 HTTP 头的 content-type 属性是 application/x-www-form-urlencoded
或 application/json
,这两种数据格式可以解析成 key/value 值,bodyParser.urlencoded(options)
方法接受一个 options 对象作为参数,可以包含参数 extended,如果值为 false
则值可以是字符串或数组,如果值为 true
则可以是任何类型。
通过将 extended 设置为 true
可以允许对象或者数组编码成 URL-encoded 格式,从而实现类似 json 的 url 编码体验。
扫码我们一起交流前端知识哈