Node.js Express res.sendFile 在 app.post 中调用时不执行任何操作

问题描述 投票:0回答:1

当我在

res.sendFile
内部调用
app.post("/publish-score"...)
时,什么也没有发生。请求的状态代码是 200。有什么想法吗?

这是我的应用程序的代码。

import express from "express";
import Boggle from "solve-boggle";
import { rateLimit } from "express-rate-limit";
import { dirname } from "path";
import { fileURLToPath } from "url";
import { readFileSync, writeFile } from "fs";
const __dirname = dirname(fileURLToPath(import.meta.url));

const app = express();
const PORT = process.env.PORT || 5001;

let user_name;
let board;

app.use(express.urlencoded({extended:true}));
app.use(express.static(__dirname));
app.use(express.json());

app.get("/", (req, res) => {
    res.sendFile(__dirname + "/public/index.html");
});

app.get("/new-board", (req, res) => {
    console.log("new board req: ", req.body);
    board = new Boggle(5);
    res.send(board);
});

app.get("/solution", (req, res) => {
    board.solve(words => {
        res.send(words);
    });
});

app.get("/name", (req, res) => {
    res.sendFile(__dirname + "/public/play.html");
})

// using get instead of post to prevent form resubmission
app.post("/name", (req, res) => {
    user_name = req.body.name;
    console.log("body: ", req.body);
    console.log("name: ", req.body.name);
    res.sendFile(__dirname + "/public/play.html");
});

// publish score
app.post("/publish-score", (req, res) => {
    console.log("request name: ", user_name);
    console.log("request score: ", req.body.score);

    let user_score = req.body.score;

    // read scores file
    let data = readFileSync("./data/scores.json", (error, data) => {
        if(error){
            console.log(error);
            return;
        };
    });
        
    // check if name already in score list
    let names = [];
    let scores_data = JSON.parse(data);
    scores_data.daily_puzzle.scores.map((entry) => names.push(entry.name));
    console.log("names: ", names);
    if (names.includes(user_name)) {
        console.log("Name used already!");
        res.sendFile(__dirname + "/public/dup_name.html");
        return;
    };

    // add name and score to list
    let push_name = user_name;
    let push_score = user_score;
    if (user_name == undefined){push_name = "NoName"}; 
    if (user_score == undefined){push_score = "NoScore"}; 
    scores_data.daily_puzzle.scores.push({
        "name": push_name,
        "score": push_score
    });

    // console.log(scores_data.daily_puzzle.scores);        

    writeFile("./data/scores.json", JSON.stringify(scores_data), (error) => {
        if (error) {
            console.log("An error has occurred ", error);
            return;
        }
        console.log("Data written successfully to the file");
    });  
    // }); 
});

app.listen(PORT, () => {console.log(`Listening on port ${PORT}`)});

当用户尝试发布名称已在

dup_name.html
中的乐谱时,我希望服务器发送
scores.json
。我尝试将其移动到
a[[.pot
中的不同位置,但没有成功。

javascript node.js express
1个回答
0
投票

使用

fs.readFile
(非阻塞版本)并异步处理结果

app.post("/publish-score", (req, res) => {
  console.log("request name: ", user_name);
  console.log("request score: ", req.body.score);

  let user_score = req.body.score;

  // Read scores file asynchronously
  fs.readFile("./data/scores.json", (error, data) => {
    if (error) {
      console.log(error);
      return res.sendStatus(500); // Handle error
    }

    const scores_data = JSON.parse(data);

    // Check for duplicate name
    const names = scores_data.daily_puzzle.scores.map((entry) => entry.name);
    if (names.includes(user_name)) {
      console.log("Name used already!");
      return res.sendFile(__dirname + "/public/dup_name.html");
    }

    // Add name and score to list (rest of the logic remains the same)
    // ...
  });
});

app.post("/publish-score", async (req, res) => {
    console.log("request name: ", user_name);
    console.log("request score: ", req.body.score);

    let user_score = req.body.score;

    try {
        // Read scores file asynchronously
        const data = await fs.promises.readFile("./data/scores.json");
        const scores_data = JSON.parse(data);

        // Check if name already in score list
        const names = scores_data.daily_puzzle.scores.map((entry) => entry.name);
        console.log("names: ", names);
        if (names.includes(user_name)) {
            console.log("Name used already!");
            return res.sendFile(__dirname + "/public/dup_name.html");
        }

        // Add name and score to list
        let push_name = user_name || "NoName";
        let push_score = user_score || "NoScore";
        scores_data.daily_puzzle.scores.push({ name: push_name, score: push_score });

        // Write data to scores.json asynchronously
        await fs.promises.writeFile("./data/scores.json", JSON.stringify(scores_data));
        console.log("Data written successfully to the file");
        
        // Success message or redirect (optional)
        // res.send("Score published successfully!");
        
    } catch (error) {
        console.error("Error processing score:", error);
        // Handle errors appropriately (e.g., send error response)
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.