将variables从Node.js服务器传递给静态页面脚本

我有一个基本的node.js应用程序提供静态index.html包含一个JS应用程序。 我有一个login路线,validation用户名/ pwd针对我的mongo数据库并redirect到“/”:

app.post('/login', function(req,res) { let inputUser=req.body.username; let inputPwd=req.body.password; findUser({'username':inputUser},function(data){ if ((data[0].srnm===inputUser)&&(data[0].psswd===inputPwd)) { res.redirect('/'); } else { res.writeHead(200); res.write(`INVALID USERNAME OR PASSWORD TRY AGAIN OR GO AWAY`); res.end(); } }); }); 

我的index.html包含一个script.src JS应用程序。

 app.get('/', function (req, res) { res.sendFile(path.join(__dirname+'/index.html')); }); 

我想在这个脚本中访问一个IS_LOGGED_IN标志。

我如何传递脚本这个信息? 我需要做一个AJAX请求/把它放在一个头之前,我的redirect莫名其妙? 或者是我的方法有点缺陷? 对不起,如果这是明显的。 我是非常新的节点(也需要学习async.js /承诺避免callback地狱)。 谢谢。

一个好的方法是使用Template Engine而不是提供一个纯粹的.html文件,所以:

pipe理索引路线:

  1. 安装一个基本模板引擎npm install ejs --save
  2. 将其用作Express Template Engine app.set('view engine', 'ejs')
  3. 设置视图pathapp.set('views', path.join(__dirname, 'views'));
  4. 渲染app.get('/'. (req, res) => res.render('Index', {IS_LOGGED: true });
  5. Index.ejs <script>window.INITIAL_STATE = {IS_LOGGED: <%- IS_LOGGED %>}; </script> <script>window.INITIAL_STATE = {IS_LOGGED: <%- IS_LOGGED %>}; </script>

pipe理loginAPI:

而不是res.write(200); ...INVALID USERNAME... res.write(200); ...INVALID USERNAME... ,使用更一致的状态码进行响应,以便您的客户端可以了解login请求何时完成。

app.get('/login', (req, res) => res.status(401).end());

你可以使用Ajax脚本,然后你应该传递一个JSON响应

 res.send({IS_LOGGED_IN: true}) 

或者使用快速闪存模块( https://www.npmjs.com/package/express-flash )作为闪存会话的标志,

 req.flash('IS_LOGGED_IN', true); 

在HTML页面上呈现你获得你的国旗:

 app.get(function(req, res, next){ return res.render('index.html', { IS_LOGGED_IN: req.flash('IS_LOGGED_IN'), }); }); 

如果您只想向页面脚本指示用户已经login,最简单的方法就是在login脚本中设置一个cookie。

 res.cookie('loggedIn', 'true') 

然后从您的脚本中访问它。

 <script type="text/javascript"> function setCookie(key, value) { var expires = new Date(); expires.setTime(expires.getTime() + (1 * 24 * 60 * 60 * 1000)); document.cookie = key + '=' + value + ';expires=' + expires.toUTCString(); } function getCookie(key) { var keyValue = document.cookie.match('(^|;) ?' + key + '=([^;]*)(;|$)'); return keyValue ? keyValue[2] : null; } if (getCookie('loggedIn')) { document.write('User is logged in') } </script>