express的基本操作
建立server
-
创建express对象
const express = require('express'); const app = express();
-
监听端口
const port = 3000; app.listen(port, () => { console.log(`App running on port ${port}...`); });
-
请求返回数据
对象.请求方法(url路径,回调函数)
返回普通数据,send
app.get('/', (req, res) => { res .status(200) .send('Hello from the server side!'); });
返回json数据,json
app.get('/', (req, res) => { res .status(200) .json({ message: 'Hello from the server side!', app: 'Natours' }); });
基础get/post 数据
get
const express = require('express');
const fs = require('fs');
const app = express();
app.use(express.json());
const tours = JSON.parse(
fs.readFileSync(`${__dirname}/dev-data/data/tours-simple.json`)
);
app.get('/api/v1/tours', (req, res) => {
res.status(200).json({
status: 'success',
results: tours.length,
data: {
tours,
},
});
});
});
const port = 3000;
app.listen(port, () => {
console.log(`App running on port ${port}...`);
});
post
const express = require('express');
const fs = require('fs');
const app = express();
app.use(express.json());
const tours = JSON.parse(
fs.readFileSync(`${__dirname}/dev-data/data/tours-simple.json`)
);
app.post('/api/v1/tours', (req, res) => {
const newId = tours[tours.length - 1].id + 1;
const newTour = Object.assign({ id: newId }, req.body);
tours.push(newTour);
fs.writeFile(
`${__dirname}/dev-data/data/tours-simple.json`,
JSON.stringify(tours),
(err) => {
res.status(201).json({
status: 'success',
data: {
newTour,
},
});
}
);
// 这里注意不能返回两个数据
// res.send('Done');
});
const port = 3000;
app.listen(port, () => {
console.log(`App running on port ${port}...`);
});
根据url绑定对象获取对应的数据
app.get('/api/v1/tours/:id', (req, res) => {
// 返回{ id:'5' }
console.log(req.params);
// 将参数转换为数值类型
const id = req.params.id * 1;
const tour = tours.find((el) => el.id === id);
// if (id > tours.length - 1) {
if (!tour) {
return res.status(404).json({
status: 'fail',
message: 'Invalid ID',
});
}
res.status(200).json({
status: 'success',
data: {
tour,
},
});
});
更新数据
- put/patch
删除数据
- delete
app.delete('/api/v1/tours/:id', (req, res) => {
if (req.params.id * 1 > tours.length - 1) {
return res.status(404).json({
status: 'fail',
message: 'Invalid ID',
});
}
res.status(204).json({
status: 'success',
data: null,
});
});
route重构
抽离出所有的方法后,定义接口:
app.get('/api/v1/tours', getAllTours);
app.get('/api/v1/tours/:id', getTour);
app.post('/api/v1/tours', createTour);
app.patch('/api/v1/tours/:id', updateTour);
app.delete('/api/v1/tours/:id', deleteTour);
由于路径有重复的,所以我们可以简化
app.route('/api/v1/tours').get(getAllTours).post(createTour);
app
.route('/api/v1/tours/:id')
.get(getTour)
.patch(updateTour)
.delete(deleteTour);
创建路由器
const router = express.Router();
router.route('/').get(getAllTours).post(createTour);
router.route('/:id').get(getTour).patch(updateTour).delete(deleteTour);
app.use('/api/v1/tours', tourRouter);
访问静态文件
app.js
// 1) middlewares
app.use(morgan('dev'));
app.use(express.json());
app.use(express.static(`${__dirname}/public/`));
在网页中访问
http://127.0.0.1:3000/overview.html
overview.html在public文件下,为什么url中不需要加入public文件呢?
因为nodejs的机制,如果找不到就会自动往public文件夹中找
环境变量
-
访问环境变量
console.log(process.env);
-
设置环境变量
config.env
NODE_ENV=development PORT=3000 USER=kihyun PASSWORD=123456
安装组件
dotenv
server.js中引入
const dotenv = require('dotenv'); dotenv.config({ path: './config.env' }); const app = require('./app'); // 4) start server const port = process.env.PORT || 3000; app.listen(port, () => { console.log(`App running on port ${port}...`); });