
学习路线(自)
后端技术统计:
项目配置文件:
{
“dependencies”: {
“body-parser”: “^2.2.0”,
“cookie-parser”: “^1.4.7”,
“express”: “^5.1.0”,
“multer”: “^2.0.2”,
“mongoose”: “^7.5.0”,
“jsonwebtoken”: “^9.0.0”
}
}
使用以上需要安装依赖:npm install
{
“dependencies”: {
“body-parser”: “^2.2.0”,
“cookie-parser”: “^1.4.7”,
“express”: “^5.1.0”,
“multer”: “^2.0.2”,
“mongoose”: “^7.5.0”,
“jsonwebtoken”: “^9.0.0”
}
}
使用以上需要安装依赖:npm install
express 搭建服务器和路由;mongoose 操作 MongoDB 数据库;jsonwebtoken 处理身份认证;body-parser/cookie-parser 解析请求数据;multer 处理文件上传。最简单结构
//express_demo.js 文件
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World');
})
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
请求和响应对象
Express 应用使用回调函数的参数: request 和 response 对象来处理请求和响应的数据
app.get('/', function (req, res) {
// --
})
request 和 response 对象的具体介绍:
Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:
req.app:当callback为外部文件时,用req.app访问express的实例
req.baseUrl:获取路由当前安装的URL路径
req.body / req.cookies:获得「请求主体」/ Cookies
req.fresh / req.stale:判断请求是否还「新鲜」
req.hostname / req.ip:获取主机名和IP地址
req.originalUrl:获取原始请求URL
req.params:获取路由的parameters
req.path:获取请求路径
req.protocol:获取协议类型
req.query:获取URL的查询参数串
req.route:获取当前匹配的路由
req.subdomains:获取子域名
req.accepts():检查可接受的请求的文档类型
req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages:返回指定字符集的第一个可接受字符编码
req.get():获取指定的HTTP请求头
req.is():判断请求头Content-Type的MIME类型
Response 对象 - response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:
res.app:同req.app一样
res.append():追加指定HTTP头
res.set()在res.append()后将重置之前设置的头
res.cookie(name,value [,option]):设置Cookie
opition: domain / expires / httpOnly / maxAge / path / secure / signed
res.clearCookie():清除Cookie
res.download():传送指定路径的文件
res.get():返回指定的HTTP头
res.json():传送JSON响应
res.jsonp():传送JSONP响应
res.location():只设置响应的Location HTTP头,不设置状态码或者close response
res.redirect():设置响应的Location HTTP头,并且设置状态码302
res.render(view,[locals],callback):渲染一个view,同时向callback传递渲染后的字符串,如果在渲染过程中有错误发生next(err)将会被自动调用。callback将会被传入一个可能发生的错误以及渲染后的页面,这样就不会自动输出了。
res.send():传送HTTP响应
res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
res.set():设置HTTP头,传入object可以一次设置多个头
res.status():设置HTTP状态码
res.type():设置Content-Type的MIME类型
实例-连接mongoDB数据库:
定义连接模块-数据库启动成功再启动服务-api文档只用获取连接对象(以下仅给了关键代码)
代码仅供参考-还需要自行编写路由配置
数据库连接格式
mongodb://用户名:密码@IP地址:27017/库名
启动文件server.js
// 服务器启动入口
const app = require('./app');
const config = require('./config');
const db = require('./config/db');
// 获取端口配置
const PORT = config.port || 4411;
// 先连接数据库,连接成功后再启动服务器
db.connect()
.then(() => {
console.log('MongoDB 已连接');
// 启动服务器
const server = app.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${PORT}`);
});
// 添加错误监听器,处理服务器启动错误
server.on('error', function(err) {
console.log('服务器启动错误:');
if (err.code === 'EADDRINUSE') {
console.log(' - 错误代码: EADDRINUSE');
console.log(` - 错误描述: 端口${PORT}已被占用`);
console.log(' - 解决方法: 请关闭占用该端口的应用或修改服务器端口');
} else {
console.log(' - 错误代码:', err.code);
console.log(' - 错误信息:', err.message);
}
process.exit(1);
});
})
.catch(err => {
console.error('无法连接到 MongoDB:', err);
process.exit(1);
});
// 处理未捕获的异常
process.on('uncaughtException', (error) => {
console.error('未捕获的异常:', error);
process.exit(1);
});
// 处理Promise rejection
process.on('unhandledRejection', (reason, promise) => {
console.error('未处理的Promise rejection:', reason);
});
module.exports = null; // server 在成功连接后才会创建并监听
DB数据库定义db.js
// MongoDB 连接模块
const mongoose = require('mongoose');
const config = require('./index');
async function connect() {
const uri = process.env.MONGO_URI || config.mongoUri;
if (!uri) {
throw new Error('MongoDB URI 未配置,请在 config/index.js 中设置 mongoUri 或通过环境变量 MONGO_URI 传入。');
}
try {
// mongoose 7+ 已不再需要 useNewUrlParser/useUnifiedTopology,但保留也不会报错
await mongoose.connect(uri, {
// 这些选项在新版本中默认启用,但显式声明以兼容老环境
useNewUrlParser: true,
useUnifiedTopology: true
});
console.log('MongoDB 已连接');
} catch (err) {
console.error('无法连接到 MongoDB:', err);
throw err;
}
}
module.exports = {
connect,
mongoose
};
拿对象写api-dbcz.js
const express = require('express');
const router = express.Router();
const { ObjectId } = require('mongodb');
// 使用已存在的 mongoose 连接(由 db.js 在 server 启动时建立)
const { mongoose } = require('../config/db');
function getColl() {
const conn = mongoose.connection;
if (!conn || !conn.db) throw new Error('数据库尚未连接');
return conn.db.collection('items');
}
// 查
router.get('/db/items', async (req, res) => {
try {
const coll = getColl();
const docs = await coll.find({}).toArray();
res.json(docs);
} catch (err) {
console.error(err);
res.status(500).json({ error: '获取列表失败' });
}
});
// 添加
router.post('/db/items', async (req, res) => {
try {
const data = req.body || {};
const coll = getColl();
const r = await coll.insertOne(data);
res.status(201).json({text:'添加成功'});
} catch (err) {
console.error(err);
res.status(500).json({ error: '创建失败' });
}
});
module.exports = router;
简单预览
// 服务器启动入口
const app = require(‘./app’);
const config = require(‘./config’);
const db = require(‘./config/db’);
// 获取端口配置
const PORT = config.port || 4411;
// 先连接数据库,连接成功后再启动服务器
db.connect()
.then(() => {
console.log(‘MongoDB 已连接’);
// 启动服务器
const server = app.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${PORT}`);
});
// 添加错误监听器,处理服务器启动错误
server.on(‘error’, function(err) {
console.log(‘服务器启动错误:’);
if (err.code === ‘EADDRINUSE’) {
console.log(‘ – 错误代码: EADDRINUSE’);
console.log(` – 错误描述: 端口${PORT}已被占用`);
console.log(‘ – 解决方法: 请关闭占用该端口的应用或修改服务器端口’);
} else {
console.log(‘ – 错误代码:’, err.code);
console.log(‘ – 错误信息:’, err.message);
}
process.exit(1);
});
})
.catch(err => {
console.error(‘无法连接到 MongoDB:’, err);
process.exit(1);
});
// 处理未捕获的异常
process.on(‘uncaughtException’, (error) => {
console.error(‘未捕获的异常:’, error);
process.exit(1);
});
// 处理Promise rejection
process.on(‘unhandledRejection’, (reason, promise) => {
console.error(‘未处理的Promise rejection:’, reason);
});
module.exports = null; // server 在成功连接后才会创建并监听
const app = require(‘./app’);
const config = require(‘./config’);
const db = require(‘./config/db’);
// 获取端口配置
const PORT = config.port || 4411;
// 先连接数据库,连接成功后再启动服务器
db.connect()
.then(() => {
console.log(‘MongoDB 已连接’);
// 启动服务器
const server = app.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${PORT}`);
});
// 添加错误监听器,处理服务器启动错误
server.on(‘error’, function(err) {
console.log(‘服务器启动错误:’);
if (err.code === ‘EADDRINUSE’) {
console.log(‘ – 错误代码: EADDRINUSE’);
console.log(` – 错误描述: 端口${PORT}已被占用`);
console.log(‘ – 解决方法: 请关闭占用该端口的应用或修改服务器端口’);
} else {
console.log(‘ – 错误代码:’, err.code);
console.log(‘ – 错误信息:’, err.message);
}
process.exit(1);
});
})
.catch(err => {
console.error(‘无法连接到 MongoDB:’, err);
process.exit(1);
});
// 处理未捕获的异常
process.on(‘uncaughtException’, (error) => {
console.error(‘未捕获的异常:’, error);
process.exit(1);
});
// 处理Promise rejection
process.on(‘unhandledRejection’, (reason, promise) => {
console.error(‘未处理的Promise rejection:’, reason);
});
module.exports = null; // server 在成功连接后才会创建并监听
// MongoDB 连接模块
const mongoose = require(‘mongoose’);
const config = require(‘./index’);
async function connect() {
const uri = process.env.MONGO_URI || config.mongoUri;
if (!uri) {
throw new Error(‘MongoDB URI 未配置,请在 config/index.js 中设置 mongoUri 或通过环境变量 MONGO_URI 传入。’);
}
try {
// mongoose 7+ 已不再需要 useNewUrlParser/useUnifiedTopology,但保留也不会报错
await mongoose.connect(uri, {
// 这些选项在新版本中默认启用,但显式声明以兼容老环境
useNewUrlParser: true,
useUnifiedTopology: true
});
console.log(‘MongoDB 已连接’);
} catch (err) {
console.error(‘无法连接到 MongoDB:’, err);
throw err;
}
}
module.exports = {
connect,
mongoose
};
const mongoose = require(‘mongoose’);
const config = require(‘./index’);
async function connect() {
const uri = process.env.MONGO_URI || config.mongoUri;
if (!uri) {
throw new Error(‘MongoDB URI 未配置,请在 config/index.js 中设置 mongoUri 或通过环境变量 MONGO_URI 传入。’);
}
try {
// mongoose 7+ 已不再需要 useNewUrlParser/useUnifiedTopology,但保留也不会报错
await mongoose.connect(uri, {
// 这些选项在新版本中默认启用,但显式声明以兼容老环境
useNewUrlParser: true,
useUnifiedTopology: true
});
console.log(‘MongoDB 已连接’);
} catch (err) {
console.error(‘无法连接到 MongoDB:’, err);
throw err;
}
}
module.exports = {
connect,
mongoose
};
const express = require(‘express’);
const router = express.Router();
const { ObjectId } = require(‘mongodb’);
// 使用已存在的 mongoose 连接(由 db.js 在 server 启动时建立)
const { mongoose } = require(‘../config/db’);
function getColl() {
const conn = mongoose.connection;
if (!conn || !conn.db) throw new Error(‘数据库尚未连接’);
return conn.db.collection(‘items’);
}
// 查
router.get(‘/db/items’, async (req, res) => {
try {
const coll = getColl();
const docs = await coll.find({}).toArray();
res.json(docs);
} catch (err) {
console.error(err);
res.status(500).json({ error: ‘获取列表失败’ });
}
});
// 添加
router.post(‘/db/items’, async (req, res) => {
try {
const data = req.body || {};
const coll = getColl();
const r = await coll.insertOne(data);
res.status(201).json({text:’添加成功’});
} catch (err) {
console.error(err);
res.status(500).json({ error: ‘创建失败’ });
}
});
module.exports = router;
const router = express.Router();
const { ObjectId } = require(‘mongodb’);
// 使用已存在的 mongoose 连接(由 db.js 在 server 启动时建立)
const { mongoose } = require(‘../config/db’);
function getColl() {
const conn = mongoose.connection;
if (!conn || !conn.db) throw new Error(‘数据库尚未连接’);
return conn.db.collection(‘items’);
}
// 查
router.get(‘/db/items’, async (req, res) => {
try {
const coll = getColl();
const docs = await coll.find({}).toArray();
res.json(docs);
} catch (err) {
console.error(err);
res.status(500).json({ error: ‘获取列表失败’ });
}
});
// 添加
router.post(‘/db/items’, async (req, res) => {
try {
const data = req.body || {};
const coll = getColl();
const r = await coll.insertOne(data);
res.status(201).json({text:’添加成功’});
} catch (err) {
console.error(err);
res.status(500).json({ error: ‘创建失败’ });
}
});
module.exports = router;





