使用 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,
  };
};
目录
相关文章
|
3月前
|
JavaScript 前端开发 中间件
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。
|
2月前
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
3月前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的完美结合
【10月更文挑战第21天】本文将引导你走进Node.js和Express框架的世界,探索它们如何共同打造一个高效、可扩展的后端服务。通过深入浅出的解释和实际代码示例,我们将一起理解这一组合的魅力所在,并学习如何利用它们来构建现代Web应用。
83 1
|
2月前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实践
【10月更文挑战第33天】在数字化时代的浪潮中,后端服务的效率和可靠性成为企业竞争的关键。本文将深入探讨如何利用Node.js和Express框架构建高效且易于维护的后端服务。通过实践案例和代码示例,我们将揭示这一组合如何简化开发流程、优化性能,并提升用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
3月前
|
JSON JavaScript 前端开发
Node.js Express 框架
10月更文挑战第7天
38 2
|
2月前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的融合之道
【10月更文挑战第31天】在追求快速、灵活和高效的后端开发领域,Node.js与Express框架的结合如同咖啡遇见了奶油——完美融合。本文将带你探索这一组合如何让后端服务搭建变得既轻松又充满乐趣,同时确保你的应用能够以光速运行。
44 0
|
3月前
|
Web App开发 JavaScript 前端开发
使用Node.js和Express框架构建Web服务器
使用Node.js和Express框架构建Web服务器
|
3月前
|
开发框架 JavaScript 前端开发
使用 Node.js 和 Express 构建 Web 应用
【10月更文挑战第2天】使用 Node.js 和 Express 构建 Web 应用
|
2月前
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
2月前
|
JavaScript
使用node.js搭建一个express后端服务器
Express 是 Node.js 的一个库,用于搭建后端服务器。本文将指导你从零开始构建一个简易的 Express 服务器,包括项目初始化、代码编写、服务启动与项目结构优化。通过创建 handler 和 router 文件夹分离路由和处理逻辑,使项目更清晰易维护。最后,通过 Postman 测试确保服务正常运行。
114 1