从一条路线到另一条路线在Ejs中使用Express会话

时间:2019-10-18 05:06:42

标签: express ejs

我正在开发一个简单的应用程序,其中主页列出了可能的酒店。您可以单击它,它会显示有关被点击酒店的更多信息。我正在使用Express和Ejs来实现此应用程序。

我所做的是,我创建了一个nav.ejs,并且此导航包含以下链接:

  1. 首页
  2. 优惠
  3. 登录
  4. 注销

但是,这些OffersLogout链接仅在用户成功登录后才会显示,否则将被隐藏,并且Signin也是如此。我在sign-in.js路由中实现了以下步骤:

router.post('/', function(req, res) {
    var username = req.body.username;
    var password = req.body.password;
    var exe = `SELECT id FROM users WHERE username = ? AND password = ?`;
    dbConn.get(exe, [username, password], (err, rs) => {
        if (err) {
            console.log('Facing problem while finding users');
        } else {
            if (rs) {
                req.session.isLoggedIn = true;
                res.locals.isLoggedIn = true;
                res.redirect('/');
            } else {
                req.flash('err', 'incorrect credintials.');
                res.render('sign-in')
            }
        }
    });
});

您可以在那看到,我正在创建一个会话,还将值也保存在本地。

req.session.isLoggedIn = true;
res.locals.isLoggedIn = true;

我在nav.ejs文件中写过

<nav>
    <a href="/">Home</a>
    <% if (locals.isLoggedIn == true) { %>
        <a href="/offers">Offers</a>
        <a href="/logout">Logout</a>
    <% } else { %>
        <a href="/sign-in">Sign-in</a>        
    <% } %>
</nav>

1 个答案:

答案 0 :(得分:0)

' ' 機能:   DDL変換ボタンクリック時のイベント ' ' 返り値:  なし ' ' 機能説明: 入力フォルダ内のフォルダおよびファイルを出力フォルダにすべてコピーする。 '      コピーしたファイル内容をPostgreSQLの構文に変換する。 ' ' 備考:   入力ファイルはOracleのDDLファイルのみ対応 ' Sub DDL変換_Click() '// 入力フォルダパスを取得 Dim strIN_PATH As String strIN_PATH = Range("C2").Value strIN_PATH = strIN_PATH & "\" strIN_PATH = Replace(strIN_PATH, "\\", "\", , , vbBinaryCompare) ' Debug.Print (strIN_PATH) '// 出力フォルダパスを取得 Dim strOUT_PATH As String strOUT_PATH = Range("C3").Value strOUT_PATH = strOUT_PATH & "\" strOUT_PATH = Replace(strOUT_PATH, "\\", "\", , , vbBinaryCompare) ' Debug.Print (strOUT_PATH) '// 出力フォルダ内のフォルダをすべて削除 Dim objFSO As New FileSystemObject Set objFSO = CreateObject("Scripting.FileSystemObject") objFSO.DeleteFolder strOUT_PATH & "*" '// 出力フォルダ内のファイルをすべて削除 Call objFSO.DeleteFile(strOUT_PATH & "*", True) ' 指定したパスのファイルを削除 '// 入力フォルダのファイルを出力フォルダへコピー objFSO.GetFolder(strIN_PATH).Copy Replace(strOUT_PATH & "\", "\\", "", , , vbBinaryCompare) '// ファイルオブジェクトを初期化 Set objFSO = Nothing '// 出力フォルダのファイルをすべて変換 Call replaceFromFolder(strOUT_PATH) '// 処理完了のメッセージを表示 MsgBox "入力ファイルのPostgreSQLへのDDL変換が完了しました。" & vbCrLf & "出力フォルダを確認してください。", vbOKOnly, "DDL変換" End Sub ' ' 機能:   指定フォルダのファイルをすべてをPostgreSQLの構文に変換する。 ' ' 返り値:  なし ' ' 機能説明: 引数に指定したフォルダのファイルをすべてをPostgreSQLの構文に変換する。 ' ' 備考:   例外処理などはなし ' Sub replaceFromFolder(searchPath) Dim FSO As New FileSystemObject Dim objFiles As File Dim objFolders As Folder Dim separateNum As Long 'サブフォルダ取得 For Each objFolders In FSO.GetFolder(searchPath).SubFolders Call replaceFromFolder(objFolders.Path) Next 'ファイル名の取得 For Each objFiles In FSO.GetFolder(searchPath).Files ' separateNum = InStrRev(objFiles.Path, "\") ' 'セルにパスとファイル名を書き込む ' ActiveCell.Value = Left(objFiles.Path, separateNum - 1) ' ActiveCell.Offset(0, 1).Value = Right(objFiles.Path, Len(objFiles.Path) - separateNum) ' ActiveCell.Offset(0, 2).Value = FileDateTime(objFiles) ' ActiveCell.Offset(0, 3).Value = Format((FileLen(objFiles) / 1024), "#.0") ' ActiveCell.Offset(1, 0).Select '// 対象ファイルをログに出力 Debug.Print (objFiles.Path) '// ファイルを変換 Call replaceFromFile(objFiles.Path) Next End Sub ' ' 機能:   指定ファイルをPostgreSQLの構文に変換する。 ' ' 返り値:  なし ' ' 機能説明: 引数に指定したファイルをPostgreSQLの構文に変換する。 ' ' 備考:   入力ファイルはOracleのDDLファイルのみ対応 ' Public Function replaceFromFile(FileName As String) Dim FSO As FileSystemObject 'ファイルシステムオブジェクト Dim Txt As TextStream 'テキストストリームオブジェクト Dim buf_strTxt As String '読み込みバッファ On Error GoTo Func_Err: 'オブジェクト作成 Set FSO = CreateObject("Scripting.FileSystemObject") Set Txt = FSO.OpenTextFile(FileName, ForReading) '全文読み込み buf_strTxt = Txt.ReadAll Txt.Close '元ファイルをリネームして、テンポラリファイル作成 Name FileName As FileName & "_" '置換処理 buf_strTxt = Replace(buf_strTxt, "NUMBER", "NUMERIC", , , vbBinaryCompare) buf_strTxt = Replace(buf_strTxt, "NVARCHAR2", "VARCHAR", , , vbBinaryCompare) buf_strTxt = Replace(buf_strTxt, "VARCHAR2", "VARCHAR", , , vbBinaryCompare) buf_strTxt = Replace(buf_strTxt, "CLOB", "TEXT", , , vbBinaryCompare) buf_strTxt = Replace(buf_strTxt, "exit;", "", , , vbBinaryCompare) '書込み用テキストファイル作成 Set Txt = FSO.CreateTextFile(FileName, True) '書込み Txt.Write buf_strTxt Txt.Close 'テンポラリファイルを削除 FSO.DeleteFile FileName & "_" '終了処理 Func_Exit: Set Txt = Nothing Set FSO = Nothing Exit Function Func_Err: MsgBox "Error Number : " & Err.Number & vbCrLf & Err.Description GoTo Func_Exit: End Function Function SJIS_to_UTF8(FN As String) Dim FROM_OBJ As Object Dim TO_OBJ As Object Set FROM_OBJ = CreateObject("ADODB.Stream") With FROM_OBJ .Type = 2 .Charset = "shift-jis" .Open .LoadFromFile FN .Position = 0 End With Set TO_OBJ = CreateObject("ADODB.Stream") With TO_OBJ .Type = 2 .Charset = "utf-8" .Open End With FROM_OBJ.CopyTo TO_OBJ TO_OBJ.Position = 0 TO_OBJ.SaveToFile FN & "_utf.txt", 2 End Function 不会持续到下一条路线。 <span>{ data.map( (item, index) => <button alt={item.alt.toUpperCase()} key={someKeyHere}> {item.alt.toUpperCase()} </button>) }</span> 对象仅适用于此特定请求。仅res.locals会保留给该用户将来的路由。在下一条路由中呼叫res之前,您必须在下一条路由中重新分配req.session

所以,当您这样做时:

res.locals

res.render()将响应发送到浏览器。现在,该请求已完成。  然后,浏览器处理重定向,并向服务器发出 req.session.isLoggedIn = true; res.locals.isLoggedIn = true; res.redirect('/'); 路由的新请求。在浏览器处理重定向后,当新的res.redirect('/')路由被命中时,您刚刚设置的/的值就会消失。

因此,在要使用渲染的模板中的会话数据的所有路由中,请从res.locals中读取数据,并为要渲染的模板设置/