首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ejs中存储和更新变量,并在不同的路由上访问它

如何在ejs中存储和更新变量,并在不同的路由上访问它
EN

Stack Overflow用户
提问于 2019-09-20 11:07:48
回答 1查看 415关注 0票数 0

对于javascript,快递,节点,ejs等,我是绝对的初学者,请对我轻松一点。:D

我正在创建一个网站,这是一个画廊的我的项目。您可以看到它们的网格,只需单击gif就可以查看实时版本。每个项目(两个迷你游戏),当点击时,会转到不同的路径(/squareTap,/guessColor)。现在我想在网站上实现不同的语言。我添加了引导下拉列表,您可以使用它选择所需的语言。它适用于主页,可以很好地修改文本。但当你去任何项目时,这些信息就会丢失.我需要它来让游戏知道它应该在哪种语言中显示癫痫警告,并相应地改变游戏描述。

这就是网站的结构:使用“节点app.js”运行;每个ejs文件都有相应的js和css文件。

代码语言:javascript
复制
//app.js
require('dotenv').config();
const express = require('express'),
    app = express(),
    bodyParser = require('body-parser'),
    https = require('https'),
    http = require('http'),
    fs = require('fs');

var setToEnglish = false;
// app.locals.setToEnglish = false;

app.use(bodyParser.urlencoded({extended: true}));
app.use(express.static(__dirname + '/views'));
app.use('/node_modules', express.static(__dirname + '/node_modules/'));
app.use('/sounds', express.static(__dirname + '/sounds/'));
app.use('/images', express.static(__dirname + '/images/'));
app.set('view engine', 'ejs');

const options = {
    key: fs.readFileSync('key.pem'),
    cert: fs.readFileSync('cert.pem')
};

app.get("/", function(req, res){
    res.render("main", { setToEnglish : setToEnglish});
});

app.get("/squareTap", function(req, res){
    res.render("squareTap", { setToEnglish : setToEnglish});
});

app.get("/guessColor", function(req, res){
    res.render("guessColor", { setToEnglish : setToEnglish});
});

https.createServer(options, app)
.listen(process.env.HTTPS_PORT, function () {
    console.log('Serving the https');
});

http.createServer(function (req, res) {
    res.writeHead(301, { 'Location': 'https://www.' + process.env.DOMAIN});
    res.end();
}).listen(process.env.HTTP_PORT);

我尝试了ejs全局变量(如果是这样的话)。基本上,我在app.js中创建了一个变量app.js,将它传递给每个视图( ejs文件),无法知道如何将它传递给js文件,所以我在ejs文件中做了一个函数声明,并在每次用户单击下拉选项更改语言时执行这些声明。

代码语言:javascript
复制
<script>
        function setGlobalToEnglish() {
            <% setToEnglish=true %>;
        }
        function setGlobalToPolish() {
            <% setToEnglish=false %>;
        }  
</script>

它没有工作,它确实改变了变量,但只在当前文件的范围内。当用户单击该项目时,他收到的默认值仍未更改。

我读了一些关于res.locals,app.locals的文章,试了一下,但没能成功。Js和ejs文件没有识别任何东西。

这就是我的目标:我需要某种方式来知道用户设置了什么语言,它应该根据用户单击的内容进行更改,可以访问视图文件( js中的js将是很好的)。游戏要做的第一件事就是检查语言并相应地编辑文本。

请帮帮忙

编辑1:我已经声明setToEnglish为全局变量(在app.js中),首先-删除var部件。然后我尝试在console.log(setToEnglish);内部main.js,得到了未定义的错误,然后在main.ejs中,在<script></script>中,也得到了未定义的错误。然后,我将变量声明改为此形式的global.setToEnglish = false,然后再试一次。在所有情况下都会得到未定义的错误。

编辑2:无法理解,所以我改变了方法。我去掉了语言变化下拉列表,并将if语句添加到我的每个视图中,这并不能完全实现我想要的结果,但足够接近了。它通过检查用户浏览器的设置来检测用户的首选语言,并相应地在网站上交换文本。

代码语言:javascript
复制
let preferredLanguage = window.navigator.language;
if(preferredLanguage.includes('en')) { 
  //changing text to english 
} else if(preferredLanguage.includes('pl')) {
  //changing text to polish
} ...
EN

回答 1

Stack Overflow用户

发布于 2022-04-27 19:27:51

一些参考资料可取自this other answer

所以这肯定会有帮助。主要的概念是,如果我们将函数/变量添加到应用程序中的全局Express实例中(在应用程序局部变量中),则可以在应用程序中全局设置函数/变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58027221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档