【问题标题】:Variable values stays even after reloading即使重新加载后变量值仍然存在
【发布时间】:2021-06-15 05:55:03
【问题描述】:
let quote;
let author;

// Get Method For The Root Route
app.get('/', (req, res)=>{
    res.render('home', {
        quote: quote,
        writer: author
    });
});

// Post Method For The Root Route
app.post('/', (req, res)=>{
    // API URL
    const url = 'https://goquotes-api.herokuapp.com/api/v1/random?count=1';

    https.get(url, (response)=>{
        console.log(response.statusCode);

        // On Getting Data From API Parse It And Update Global Variables 
        response.on('data', (data)=>{
            const randomQuote = JSON.parse(data);
            quote = '" ' + randomQuote.quotes[0].text + ' "';
            author = '- ' + randomQuote.quotes[0].author;
            console.log(quote);
            res.redirect('/');
        });
    });
});

我正在使用 Node 和 ExpressJS。当我在我的计算机上本地尝试这个 Web 应用程序时,每当我重新加载页面时,变量引用并且作者变得未定义(这就是我想要的),但是当我在 Heroku 上部署我的应用程序时,即使在刷新我的页面后一旦值设置为那些变量它们保持不变并且不会变空。我希望它像在本地机器上一样工作,任何帮助将不胜感激

【问题讨论】:

  • 我不确切知道这里发生了什么,但我强烈建议您避免在您的应用程序中使用全局变量。它会导致意外的行为,也使测试变得更加困难。
  • 你不应该使用全局变量,如果你愿意,你可以使用res.locals
  • 如果您希望此信息在多个路由中“持续存在”,则需要将其存储在会话中,否则保存为全局变量将不起作用。您的 API 应该是无状态的。
  • @MohammedAlhila 在这种情况下您不能使用res.locals,因为它们是处理不同路由的两个不同控制器。如果其中一个是在最后一个函数执行之前运行的中间件函数,那么res.locals 将适用于此。
  • @goto1 是的,谢谢。正是我在谈论中间件

标签: javascript node.js express heroku ejs


【解决方案1】:

它们是在全局范围内定义的,这意味着它们作为节点中全局对象的属性存在(例如 globalThis.quote 和 globalThis.author),只要应用程序运行,它们就会一直存在。

我假设当您说您在本地重新加载页面时,您会重新启动节点脚本/应用程序。但是,当您上传应用程序并重新加载页面时,您不会仅重新加载应用程序,而是仅重新加载呈现的页面,这意味着它们仍然存在。

【讨论】:

    猜你喜欢
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多