express

作者: 林智_lz | 来源:发表于2022-05-06 19:34 被阅读0次

    const fs = require('fs');

    const game = require('./game')

    const express = require('express');

    // 玩家胜利次数,如果超过3,则后续往该服务器的请求都返回500

    var playerWinCount = 0

    // 玩家的上一次游戏动作

    var lastPlayerAction = null;

    // 玩家连续出同一个动作的次数

    var sameCount = 0;

    const app = express();

    // 通过app.get设定 /favicon.ico 路径的路由

    // .get 代表请求 method 是 get,所以这里可以用 post、delete 等。这个能力很适合用于创建 rest 服务

    app.get('/favicon.ico', function (request, response) {

        // 一句 status(200) 代替 writeHead(200); end();

        response.status(200)

        return;

    })

    // 设定 /game 路径的路由

    app.get('/game',

        function (request, response, next) {

            if (playerWinCount >= 3 || sameCount == 9) {

                response.status(500);

                response.send('我不会再玩了!');

                return;

            }

            // 通过next执行后续中间件

            next();

            // 当后续中间件执行完之后,会执行到这个位置

            if (response.playerWon) {

                playerWinCount++;

            }

        },

        function (request, response, next) {

            // express自动帮我们把query处理好挂在request上

            const query = request.query;

            const playerAction = query.action;

            if (!playerAction) {

                response.status(400);

                response.send();

                return;

            }

            if (lastPlayerAction == playerAction) {

                sameCount++

                if (sameCount >= 3) {

                    response.status(400);

                    response.send('你作弊!我再也不玩了');

                    sameCount = 9

                    return;

                }

            } else {

                sameCount = 0;

            }

            lastPlayerAction = playerAction;

            // 把用户操作挂在response上传递给下一个中间件

            response.playerAction = playerAction

            next();

        },

        function (req, response) {

            const playerAction = response.playerAction;

            const result = game(playerAction);

            // 如果这里执行setTimeout,会导致前面的洋葱模型失效

            // 因为playerWon不是在中间件执行流程所属的那个事件循环里赋值的

            // setTimeout(()=> {

                response.status(200);

                if (result == 0) {

                    response.send('平局')

                } else if (result == -1) {

                    response.send('你输了')

                } else {

                    response.send('你赢了')

                    response.playerWon = true;

                }

            // }, 500)

        }

    )

    app.get('/', function (request, response) {

        // send接口会判断你传入的值的类型,文本的话则会处理为text/html

        // Buffer的话则会处理为下载

        response.send(

            fs.readFileSync(__dirname + '/index.html', 'utf-8')

        )

    })

    app.listen(3000);

    相关文章

      网友评论

          本文标题:express

          本文链接:https://www.haomeiwen.com/subject/bfpzyrtx.html