中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Express框架req?res對象如何使用

發布時間:2023-03-25 11:16:09 來源:億速云 閱讀:126 作者:iii 欄目:開發技術

這篇文章主要講解了“Express框架req res對象如何使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Express框架req res對象如何使用”吧!

    Express 請求 req 和響應 res 對象定義:

    var req = Object.create(http.IncomingMessage.prototype)
    var res = Object.create(http.ServerResponse.prototype)

    下面是屬性繼承關系:

    原型繼承來源類
    http.IncomingMessage.prototypeStream.Reabable
    http.ServerResponse.prototypeIncomingMessage

    IncomingMessage

     class IncomingMessage extends stream.Readable {
        constructor(socket: Socket);
        aborted: boolean;
        httpVersion: string;
        httpVersionMajor: number;
        httpVersionMinor: number;
        complete: boolean;
        connection: Socket;
        socket: Socket;
        headers: IncomingHttpHeaders;
        rawHeaders: string[];
        trailers: NodeJS.Dict<string>;
        rawTrailers: string[];
        setTimeout(msecs: number, callback?: () => void): this;
        method?: string | undefined;
        url?: string | undefined;
        statusCode?: number | undefined;
        statusMessage?: string | undefined;
        destroy(error?: Error): this;
    }

    ServerResponse

    class ServerResponse<Request extends IncomingMessage = IncomingMessage> extends OutgoingMessage<Request> {
        statusCode: number;
        statusMessage: string;
        constructor(req: Request);
        assignSocket(socket: Socket): void;
        detachSocket(socket: Socket): void;
        writeContinue(callback?: () => void): void;
        writeEarlyHints(hints: Record<string, string | string[]>, callback?: () => void): void;
        writeHead(
            statusCode: number,
            statusMessage?: string,
            headers?: OutgoingHttpHeaders | OutgoingHttpHeader[],
        ): this;
        writeHead(statusCode: number, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[]): this;
        writeProcessing(): void;
    }

    接下來的任務還是很簡單,看看 express 是如何處理請求 req 對象上的屬性和方法。

    請求對象 req

    在 req 對象上擴展方法

    屬性和方法名說明
    get()/header()返回指定的 HTTP 請求頭字段(不區分大小寫的匹配)。
    accepts()根據請求的 HTTP 標字段檢查指定的內容類型是否可接受。
    acceptsEncodings()返回指定編碼的第一個接受編碼。
    acceptsCharsets()返回指定字符集的第一個接受的字符集。
    acceptsLanguages()返回指定語言的第一個接受語言。
    range()Range 標頭解析器。
    param()返回 req 對象中 params
    is()如果傳入請求的 內容類型 HTTP 頭字段,則返回匹配的內容類型 匹配參數指定的 MIME 類型。

    使用 defineGetter 函數擴展屬性:

    function defineGetter(obj, name, getter) {
      Object.defineProperty(obj, name, {
        configurable: true,
        enumerable: true,
        get: getter
      });
    }
    屬性說明
    protocol協議
    secure是否安全
    ip請求的 ip 地址
    ips請求頭中的 ip 地址數組
    subdomains請求中的子域名
    path包含請求 URL 的路徑部分。
    hostname主機名
    fresh是否為最新的
    stale是否為過時的
    xhr請求中是否包 xmlHTTPRequest 字符串

    這是屬性還是跟 HTTP 通信,前后端通信 xhr,如:完整的路徑 path/protocol/secure/subdomains, ip 相關,服務器相關 fresh/stable。

    響應對象

    在 res 對象上擴展方法:

    屬性和方法名說明
    status()設置響應狀態碼。
    links()用給定的 links 設置頭字段
    send()發送 HTTP 響應。
    json()發送 JSON 響應。
    jsonp()發送 JSONP 響應。
    sendStatus()發送狀態碼
    sendFile()在給定的路徑處傳輸文件。
    sendfile()在給定的 .設置響應 HTTP 頭字段 基于文件名的擴展名。
    download()下載文件
    type()將 HTTP 標頭設置為由指定的。
    format()格式化請求對象的上內容
    attachment()在響應頭中添加額外的內容
    append()將數據最加到尾部
    set()/header()設置 http 頭信息
    get()獲取指定 http 頭數據
    clearCookie()清除 cookie 內容
    cookie()設置 cookie
    location()將響應 HTTP 標頭設置為指定的參數。
    redirect()重定向地址
    vary()使用 vary 方法添加字段到請求頭
    render()渲染模板中 html

    設置狀態碼

    res.status(203)
    console.log(res.statusCode)
    res.send("get v1: hello world!")

    如何來快速測試這些屬性和方法呢?

    • 準備好接口, 熟悉 restful api 或者其他范式的形式接口

    • 準備寫接口時的工具。curl(熟悉命令行)、工具(類似于:postman 等等)

    • 將工具接口與 express 的接口對應起來進行調試測試,驗證屬性。本項目使用

    下面給出一些示例代碼

    目錄結構

    .
    ├── __tests__
    ├── babel.config.js
    ├── index.js
    ├── index.md
    ├── jest.config.js
    ├── node_modules
    ├── package.json
    ├── pnpm-lock.yaml
    ├── public
    └── views

    安裝依賴

    • views 中的 home.ejs 需要 ejs, 內容如下:

    <html>
    <head>
        <title>Home 頁面</title>
    </head>
    <body>
        <h3>歡迎來到 Home 頁面</h3>
    </body>
    </html>

    安裝其他的依賴包:

    pnpm install ejs babel-jest dirname-filename-esm jest nodemon supertest @babel/preset-react @babel/preset-env @babel/plugin-syntax-jsx @babel/core

    看看 package.json 項目配置

    {
      "name": "debugger-source-code",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "type": "module",
      "scripts": {
        "dev": "nodemon index.js",
        "test": "NODE_OPTIONS=--experimental-vm-modules jest"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "dependencies": {
        "@babel/core": "^7.21.0",
        "@babel/plugin-syntax-jsx": "^7.18.6",
        "@babel/preset-env": "^7.20.2",
        "@babel/preset-react": "^7.18.6",
        "babel-jest": "^29.4.3",
        "dirname-filename-esm": "^1.1.1",
        "ejs": "^3.1.8",
        "express": "^4.18.2",
        "jest": "^29.4.3",
        "nodemon": "^2.0.20",
        "supertest": "^6.3.3"
      }
    }

    看看 babel 配置

    export default {
      presets: [
        ["@babel/preset-env", { targets: { node: "current" } }],
        "@babel/preset-react",
      ],
    };

    看看 eslint 配置

    module.exports = {
        "env": {
            "browser": true,
            "es2021": true
        },
        "extends": "eslint:recommended",
        "overrides": [
        ],
        "parserOptions": {
            "ecmaVersion": "latest",
            "sourceType": "module"
        },
        "rules": {
        }
    }

    看看 jest 配置

    export default {
      transform: {
        '\\.[jt]s?$': 'babel-jest'
      },
    };

    express 主要服務 index.js

    import express from "express";
    import path from "path";
    import { dirname } from "dirname-filename-esm";
    
    const __dirname = dirname(import.meta);
    
    const app = express();
    
    app.set("view engine", "ejs");
    
    app.use(express.static(path.join(__dirname, "public")));
    
    app.get("/req", (req, res, next) => {
      console.log(req.protocol); // http 協議
      console.log(req.secure); //fals
      console.log(req.ip); //::1
      console.log(req.ips); // []
      console.log(req.subdomains); // []
      console.log(req.path); // /favicon.ico
      console.log(req.host); // localhost 已經被廢棄
      console.log(req.hostname); // localhost
      console.log(req.fresh); // false
      console.log(req.stale); // true
      console.log(req.xhr); //false
    
      //------------- get ------------- //
      let a1 = req.get("set-cookie");
      console.log("set-cookie", a1); // undefined
    
      //------------- header ------------- //
      let a2 = req.header("set-cookie");
      console.log("set-cookie", a2); // undefined
    
      //------------- accepts ------------- //
      let b1 = req.accepts();
      console.log("accepts", b1);
      //   accepts [
      //   'image/avif',
      //   'image/webp',
      //   'image/apng',
      //   'image/svg+xml',
      //   'image/*',
      //   '*/*'
      // ]
    
      //------------- acceptsEncodings ------------- //
      let b2 = req.acceptsEncodings();
      console.log("acceptsEncodings", b2); //  [ 'gzip', 'deflate', 'br', 'identity' ]
    
      //------------- acceptsLanguages ------------- //
      let c1 = req.acceptsLanguages();
      console.log("acceptsLanguages", c1); // [ 'zh-CN', 'zh' ]
    
      //------------- range ------------- //
      let range = req.range(10, {});
      console.log("range", range); // undefined
    
      //------------- param ------------- //
      let param = req.param();
      console.log("param", param); // undefined
    
      res.send("hello world!");
    });
    
    app.get("/res/status", (req, res, next) => {
      res.status(203);
      console.log(res.statusCode);
      res.send("get v1: hello world! and status code: 203 === " + res.statusCode);
    });
    
    app.get("/res/statusCode", (req, res, next) => {
      res.send("get v1: hello world! and status code:" + res.statusCode);
    });
    
    app.get("/res/links", (req, res, next) => {
      res.links({
        a: "http://localhost:3232",
      });
      res.send("links set"); // header Link filed
    });
    
    app.get("/res/send", (req, res, next) => {
      res.send("links set"); //type: string
    });
    
    app.get("/res/send/object", (req, res, next) => {
      res.send({ msg: "123" }); // type object json
    });
    
    app.get("/res/send/json", (req, res, next) => {
      res.json(JSON.stringify({ msg: "json" })); // type object json
    });
    
    app.get("/res/send/jsonp", (req, res, next) => {
      let fn = req.query.fn;
      let data = JSON.stringify({
        data: "mydata",
      });
      res.end(fn + data); // type object json
    });
    
    app.get("/res/send/sendStatus", (req, res, next) => {
      res.sendStatus(404);
    });
    
    app.get("/res/send/sendFile", (req, res, next) => {
      res.sendFile(path.join(__dirname, "jest.config.js"));
    });
    
    app.get("/res/send/download", (req, res, next) => {
      res.download(path.join(__dirname, "jest.config.js"));
    });
    
    app.get("/res/send/type", (req, res, next) => {
      res.type(".html").send("<div>123</div>");
    
      // image/png
      console.log(res.get("Content-type"));
    });
    
    app.get("/res/send/format", (req, res, next) => {
      res.format({
        "text/html": function () {
          res.send("<div>This is html</div>");
        },
        "text/pain": function () {
          res.send("this is html text");
        },
        "application/json": function () {
          res.send({ message: "This is html json" });
        },
        default: function () {
          res.status(406).send("Not Acceptable");
        },
      });
    });
    
    app.get("/res/send/attachment", (req, res, next) => {
      res.attachment("index.md");
      console.log(req.get("Content-Disposition"));
      res.send("attachment");
      // 	attachment; filename="index.md"
    });
    
    app.get("/res/send/append", (req, res, next) => {
      res.append("Warning", "201 Warning");
      console.log(res.get("Warning")); // Warning	201 Warning
      res.send("append");
    });
    
    app.get("/res/send/set", (req, res, next) => {
      res.set("set8", "set8888"); //響應 header 中
      res.send("set");
    });
    
    app.get("/res/send/header", (req, res, next) => {
      res.header("set9", "set9999"); //響應 header 中
      res.send("set9");
    });
    
    app.get("/res/send/get", (req, res, next) => {
      res.set({
        "Content-Type": "text/plain",
        "Content-Length": "123",
        ETag: "12345",
      });
      let ct = res.get("Content-Type"); //響應 header 中
      res.send("[get => ]" + ct);
    });
    
    app.get("/res/send/cookie", (req, res, next) => {
      res.cookie("abc", "dd"); //響應 header 中
      res.send("cookie: abcdd");
    });
    
    app.get("/res/send/clearCookie", (req, res, next) => {
      res.cookie("abc", "dd");
      res.cookie("def", "xj");
      res.clearCookie("abc");
      res.send("cookie: abcdd");
    });
    
    app.get("/res/send/location", (req, res, next) => {
      res.location("http://demo.com");
      console.log(res.get("location")); // http://demo.com
    
      res.send(res.get("location"));
    });
    
    app.get("/res/send/redirect", (req, res, next) => {
      res.redirect("/res/send/redirect-new");
    });
    
    app.get("/res/send/redirect-new", (req, res, next) => {
      res.send("this is redirect-new");
    });
    
    app.get("/res/send/vary", (req, res, next) => {
      res.vary("User-Agent").send("Field added to the Vary response header");
    });
    
    app.get("/res/send/render", (req, res, next) => {
      res.render('home')
    });
    
    app.listen(3232, () => {
      console.log("listening on http://localhost:3232");
    });

    感謝各位的閱讀,以上就是“Express框架req res對象如何使用”的內容了,經過本文的學習后,相信大家對Express框架req res對象如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    博湖县| 洛南县| 博白县| 甘谷县| 苏尼特右旗| 收藏| 江安县| 丽江市| 兖州市| 射洪县| 舞阳县| 景东| 宁都县| 宾川县| 临泉县| 澄迈县| 万载县| 绥江县| 轮台县| 民丰县| 肃南| 沾益县| 桃园县| 论坛| 习水县| 达日县| 和静县| 威远县| 奉节县| 钟祥市| 苏尼特右旗| 勃利县| 宝清县| 祥云县| 临泉县| 专栏| 时尚| 临武县| 巴马| 新乡市| 积石山|