首先新建一个文件夹,并在命令行下运行npm init -y
分别修改以下文件
index.js
/*
const express = require('express'); // 加载模块
const app = express();
const port = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.send('Hello world');
});
app.listen(port, () => {
console.log('Express web app');
});
*/
/*
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
//const articles = [{title: 'Example'}];
const Article = require('./db').Article;
app.set('port', process.env.PORT || 3000);
app.use(bodyParser.json()); // 支持编码为json的请求消息体
app.use(bodyParser.urlencoded({extended: true})); // 支持编码为表单的请求消息体
app.get('/articles', (req, res, next) => {
res.send(articles);
});
app.post('/articles', (req, res, next) => {
const article = {title: req.body.title};
articles.push(article);
res.send(articles);
});
app.get('/articles/:id', (req, res, next) => {
const id = req.param.id;
console.log('Fetching:', id);
res.send(articles[id]);
});
app.delete('/articles/:id', (req, res, next) => {
const id = req.param.id;
console.log('Deleting:', id);
delete articles[id];
res.send({message: 'Deleted'});
});
app.listen(app.get('port'), () => {
console.log('App started on port', app.get('port'));
});
module.exports = app;
*/
const read = require('node-readability');
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
//const articles = [{title: 'Example'}];
const Article = require('./db').Article;
app.set('port', process.env.PORT || 3000);
app.use(bodyParser.json()); // 支持编码为json的请求消息体
app.use(bodyParser.urlencoded({extended: true})); // 支持编码为表单的请求消息体
//
app.use(
'/css/bootstrap.css',
express.static('node_modules/bootstrap/dist/css/bootstrap.css')
);
app.get('/articles', (req, res, next) => {
Article.all((err, articles) => {
if(err) {
return next(err);
}
// res.send(articles);
res.format({
html: () => {
res.render('article.ejs', {articles: articles});
},
json: () => {
res.send(articles);
}
});
});
});
app.post('/articles', (req, res, next) => {
const url = req.body.url;
read(url, (err, result) => {
if(err || !result) {
res.status(500).send('Error downloading article');
}
Article.create({title: result.title, content: result.content},
(err, article) => {
if(err) {
return next(err);
}
res.send('OK');
}
);
});
});
app.get('/articles/:id', (req, res, next) => {
const id = req.param.id;
Article.find(id, (err, article) => {
if(err) {
return next(err);
}
res.send(article);
});
});
app.delete('/articles/:id', (req, res, next) => {
const id = req.param.id;
Article.delete(id, (err) => {
if(err) {
return next(err);
}
res.send({message: 'Deleted'});
});
});
app.listen(app.get('port'), () => {
console.log('App started on port', app.get('port'));
});
module.exports = app;
db.js
const sqlite3 = require('sqlite3').verbose();
const dbName = 'later.sqlite';
const db = new sqlite3.Database(dbName); // 连接到一个数据库文件
// 如果没有,创建一个articles表
// 注意下面这个表的表的名字不要写错了,我自己在这边被坑了好长时间
db.serialize(() => {
const sql = 'create table if not exists articles(id integer primary key, title, content TEXT)';
db.run(sql);
});
class Article {
static all(cb) {
db.all('select * from articles', cb);
}
static find(id, cb) {
db.get('select * from articles where id = ?', id, cb);
}
static create(data, cb) {
const sql = 'insert into articles(title, content) values (?, ?)';
db.run(sql, data.title, data.content, cb);
}
static delete(id, cb) {
if(!id) {
return cb(new Error('Please provide an id'));
}
db.run('delete from articles where id = ?', id, cb);
}
}
module.exports = db;
module.exports.Article = Article;
package.json
{
"name": "later",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"body-parser": "^1.19.0",
"bootstrap": "^4.3.1",
"ejs": "^2.6.1",
"express": "^4.16.4",
"node-readability": "^3.0.0",
"sqlite3": "^4.0.6"
}
}
views目录下的head.ejs
<html>
<head>
<title>Later</title>
<link rel="stylesheet" href="/css/bootstrap.css">
</head>
<body>
<div class="container">
foot.ejs
</div>
</body>
</html>
article.ejs
<% include head %>
<ul>
<% articles.forEach((article) => { %>
<li>
<a href="/articles/<%= article.id %>">
<%= article.title %>
</a>
</li>
<% }) %>
</ul>
<% include foot %>
运行结果
用postman工具添加文章
然后在浏览器中输入以下的网址