簡體   English   中英

Node.js 全局變量只工作一次

[英]Node.js global variable only works once

我的服務器端代碼中有一個全局變量在一個 post 路由中,我試圖在另一個 post 路由中訪問它。 第一次調用第二個 post 路由時代碼完美執行,但是第二次觸發第二個 post 路由時,全局變量的值變為undefined

聲明全局變量的第一個 post 路由的片段:

app.post("/login", function(req, res) {
    ...
    fs.readFile('results.json', function (err, data) {
    if(err){
        console.log(err)

    } else{    

    var json = JSON.parse(data)

    ...

    global.Identifier;
    global.Identifier = Identifier;
    return global.Identifier;

    } 
    }

);
res.redirect("/");
});

訪問全局變量的第二個帖子請求的片段:

app.post("/addtask", function(req, res) {
    var gloablIdentifier = global.Identifier;
    ...
    res.redirect("/");
};

(第二次訪問第二個 post 請求時, gloablIdentifier的值 = undefined

注意:我知道使用全局變量是非常糟糕的做法,在大多數情況下應該不惜一切代價避免使用,但我仍然想解決這個問題。

提前致謝

您沒有等待 readFile 必須完成並返回response 由於fs.readFile是異步的, global.Identifier將在稍后更新。 您可以等待讀取文件然后返回;

app.post("/login", function(req, res) {
  fs.readFile("results.json", function(err, data) {
    if (err) {
      console.log(err);
    } else {
      var json = JSON.parse(data);
      global.Identifier = Identifier;
      return global.Identifier;
    }
    // wait for read file
    res.redirect("/");
  });
  // res.redirect("/");
});

異步等待版本:

const { promisify } = require("util");
const readFile = promisify(fs.readFile);

app.post("/login", async function(req, res) {
  try {
    const data = await readFile("results.json");
    var json = JSON.parse(data);
    global.Identifier = Identifier;
    return res.redirect("/");
  } catch (error) {
    return res.redirect("/");
  }
});

從它的外觀來看,您正在使用類似 Express 的東西。

盡管這可能是一種不好的做法,但我認為您應該嘗試使用 express 本身提供的set功能。

因此,在您的 app.js 中這樣做:

app.set("identifier", Identifier)

然后,在您的路線中:

app.post("/addtask", function(req, res) {
    var gloablIdentifier = app.get('identifier')
    ...
    res.redirect("/");
};

我沒有測試這個,它基於文檔這個答案

編輯:我測試了這個並且它有效。 另外,要再次更改變量,只需在您的路線上執行以下操作:

app.set('identifier', newValue)

我希望現在答案是完整的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM