node.js-Express(api学习笔记)-持续更新

学习路线(自)

后端技术统计:

项目配置文件:
{
  “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 在成功连接后才会创建并监听
// 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 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;

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇