使用 Express 框架开发数据爬取及展示接口

简介: 使用 Express 框架开发数据爬取及展示接口

Express基础项目结构搭建

修改配置

image.png

创建index.ts文件在src目录下书console.log(1111);

image.png

image.png

如果运行时无法找到index.js文件

image.png

就是并行运行,可能会在编译文件未完成就开始调用了index.js文件。

image.png

使用express构建一个服务器

npm install express -save

image.png

安装类型注解

image.png

image.png

书写app服务器并运行npm run dev

import express from "express";
const app = express();
app.get("/", (req, res) => {
  res.send("hello world");
});
// 启动服务器
app.listen(7001, () => {
  console.log("server is running");
});

image.png

image.png

书写类型注解

image.png

import express, { Response, Request } from "express";
const app = express();
app.get("/", (req: Request, res: Response) => {
  res.send("hello world");
});
app.get("/bye", (req: Request, res: Response) => {
  res.send("bye world");
});
// 启动服务器
app.listen(7001, () => {
  console.log("server is running");
});

image.png

书写路由

创建一个router.ts

import { Router, Request, Response } from "express";
import Crowller from "./crowller";
import DellAnalyzer from "./dellAnalyzer";
const router = Router();
router.get("/", (req: Request, res: Response) => {
  res.send("hello world !");
});
router.get("/getData", (req: Request, res: Response) => {
  const secret = "secretKey";
  const url = `http://www.dell-lee.com/typescript/demo.html?secret=${secret}`;
  const analyzer = DellAnalyzer.getInstance();
  new Crowller(url, analyzer);
  res.send("getData Success!");
});
export default router;

使用Ts编写常规express代码遇到的问题

body-parser引用

$ npm install body-parser

index.ts

import express, { Request, Response } from "express";
import bodyParser from "body-parser";
import router from "./router";
// 问题1: express 库的类型定义文件 .d.ts 文件类型描述不准确
// 问题2: 当我使用中间件的时候,对 req 或者 res 做了修改之后呢,实际上类型并不能改变。
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(router);
app.listen(7001, () => {
  console.log("server is running");
});

router.ts

import { Router, Request, Response } from "express";
import Crowller from "./crowller";
import DellAnalyzer from "./dellAnalyzer";
const router = Router();
router.get("/", (req: Request, res: Response) => {
  res.send(`<html>
    <body>
      <form method="post" action="/getData">
      <input type="password" name="password" />
      <button>提交</button>
      </form>
    </body>
  </html>`);
});
router.post("/getData", (req: Request, res: Response) => {
  if (req.body.password === "123") {
    const secret = "secretKey";
    const url = `http://www.dell-lee.com/typescript/demo.html?secret=${secret}`;
    const analyzer = DellAnalyzer.getInstance();
    new Crowller(url, analyzer);
    res.send("getData Success!");
  } else {
    res.send("password Error!");
  }
});
export default router;

image.png

扩展解决Express的类型定义文件问题

修改index.d.ts

image.png

问题1: express 库的类型定义文件 .d.ts 文件类型描述不准确

引入之前的文件的描述内容,对内容进行改变,修正错误的内容。

interface RequestWithBody extends Request {
  body: {
    [key: string]: string | undefined;
  };
}

问题2: 当我使用中间件的时候,对 req 或者 res 做了修改之后呢,实际上类型并不能改变。

类型融合

index.ts

import express, { Request, Response, NextFunction } from "express";
import bodyParser from "body-parser";
import router from "./router";
import request from "superagent";
// 问题1: express 库的类型定义文件 .d.ts 文件类型描述不准确
// 问题2: 当我使用中间件的时候,对 req 或者 res 做了修改之后呢,实际上类型并不能改变。
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use((req: Request, res: Response, next: NextFunction) => {
  req.teacherName = "dell";
  next();
});
app.use(router);
app.listen(7001, () => {
  console.log("server is running");
});

custom.ts

declare namespace Express {
  interface Request {
    teacherName: string;
  }
}

image.png

登录的开发模块

安装cookie-session

npm install cookie-session --save

npm install @types/cookie-session -D

import { Router, Request, Response } from "express";
import Crowller from "./crowller";
import DellAnalyzer from "./dellAnalyzer";
import fs from "fs";
import path from "path";
const router = Router();
interface RequestWithBody extends Request {
  body: {
    [key: string]: string | undefined;
  };
}
router.get("/", (req: RequestWithBody, res: Response) => {
  const isLogin = req.session ? req.session.login : false;
  if (isLogin) {
    res.send(`<html>
    <body>
    <a href='/getData'>爬取内容</a>
    <a href='/showData'>展示内容</a>
    <a href='/logout'>退出</a>
    </body>
  </html>`);
  } else {
    res.send(`<html>
    <body>
      <form method="post" action="/login">
      <input type="password" name="password" />
      <button>提交</button>
      </form>
    </body>
  </html>`);
  }
});
router.post("/login", (req: Request, res: Response) => {
  const { password } = req.body;
  const isLogin = req.session.login ? req.session.login : false;
  if (isLogin) {
    res.send("已经登录过了");
  } else {
    if (password === "123" && req.session) {
      req.session.login = true;
      res.send("登录成功!");
    }
    res.send(`password Error!`);
  }
});
router.get("/getData", (req: Request, res: Response) => {
  const isLogin = req.session.login ? req.session.login : false;
  if (isLogin) {
    const secret = "secretKey";
    const url = `http://www.dell-lee.com/typescript/demo.html?secret=${secret}`;
    const analyzer = DellAnalyzer.getInstance();
    new Crowller(url, analyzer);
    res.send("getData Success!");
  } else {
    res.send("请登陆后爬取内容");
  }
});
router.get("/showData", (req: Request, res: Response) => {
  const isLogin = req.session ? req.session.login : false;
  if (isLogin) {
    try {
      const position = path.resolve(__dirname, "../data/course.json");
      const result = fs.readFileSync(position, "utf-8");
      res.json(JSON.parse(result));
    } catch (e) {
      res.send("尚未爬取到内容");
    }
  }
});
router.get("/logout", (req: Request, res: Response) => {
  if (req.session) {
    req.session.login = undefined;
  }
  res.redirect("/");
});
export default router;

统一接口数据结构,优化代码

interface Result {
  success: boolean;
  errMsg?: string;
  data: any;
}
export const getResponseData = (data: any, errMsg?: string): Result => {
  if (errMsg) {
    return {
      success: false,
      errMsg,
      data,
    };
  }
  return {
    success: true,
    data,
  };
};
目录
相关文章
|
1月前
|
开发框架 JavaScript 安全
js开发:请解释什么是Express框架,以及它在项目中的作用。
【4月更文挑战第24天】Express是Node.js的Web开发框架,简化路由管理,支持HTTP请求处理。它包含中间件系统用于日志、错误处理和静态文件服务,集成多种模板引擎如EJS、Jade、Pug。框架还提供安全中间件提升应用安全,并具有良好的可扩展性,便于项目功能扩展和开发效率提升。
48 3
|
20天前
|
JavaScript 前端开发 中间件
Express框架搭建项目 node.js
【6月更文挑战第3天】这篇文章是关于使用Express框架构建Node.js Web应用的教程。Express是一个轻量级、功能丰富的框架,特点包括简洁灵活的核心、强大的中间件支持、灵活的路由系统和模板引擎兼容性。文章介绍了如何安装Express,并通过一个简单的示例展示了如何创建一个基本的Web服务器。最后,鼓励读者继续学习和实践,以充分利用Express和Node.js的能力。
24 1
|
20天前
|
SQL JavaScript 前端开发
简单用Nodejs + express 编写接口
【6月更文挑战第3天】该文介绍了如何在Node.js和Express中创建GET和POST接口。首先,简要提到了准备工作,建议查阅上一篇文章。接着展示了GET接口的示例,说明可以直接在浏览器中请求。然后,详细解释了POST接口的步骤,包括引入Express模块、设置路由处理程序、解析请求体及处理请求。最后,强调了编写接口时应注意错误处理、安全性、中间件使用、路由组织、日志记录、性能优化和测试等关键点。作者以肥晨的身份结尾,鼓励关注其分享的前端学习资料和技术动态。
20 1
|
9天前
|
JSON JavaScript 中间件
Node.js Express 框架
Node.js Express 框架
12 0
|
27天前
|
Web App开发 JavaScript Cloud Native
构建高效可扩展的RESTful API:Node.js与Express框架实践指南构建未来:云原生架构在企业数字化转型中的关键作用
【5月更文挑战第29天】 在数字化时代的驱动下,后端服务架构的稳定性与效率成为企业竞争力的关键。本文深入探讨了如何利用Node.js结合Express框架构建一个高效且可扩展的RESTful API。我们将从设计理念、核心模块、中间件应用以及性能优化等方面进行系统性阐述。通过实例引导读者理解RESTful接口设计的最佳实践,并展示如何应对大规模并发请求的挑战,确保系统的高可用性与安全性。
|
29天前
|
Web App开发 JavaScript 前端开发
构建高效Web API:使用Node.js与Express框架
构建高效Web API:使用Node.js与Express框架
22 0
|
1月前
|
开发框架 JavaScript 中间件
深入探索Node.js的Express框架:使用与中间件详解
【4月更文挑战第30天】本文深入探讨了Node.js的Express框架,介绍了其作为Web开发的强大工具,主要聚焦于基本使用和中间件。Express是基于Node.js的Web应用框架,用于构建高效的应用和API。文章详细讲解了如何安装Express,创建简单应用,以及中间件的工作原理和应用,包括中间件的顺序、错误处理和挂载位置。此外,还提到了使用第三方中间件扩展功能。理解Express基础和中间件对于开发高质量Web应用至关重要。
|
1月前
初识express框架
初识express框架
|
1月前
|
开发框架 JSON JavaScript
Node.js教程-express框架
Node.js教程-express框架
45 1
|
1月前
|
JSON JavaScript 前端开发
超级实用!详解Node.js中的util模块和express模块
超级实用!详解Node.js中的util模块和express模块