簡體   English   中英

Node.js Express4-未定義的會話

[英]Nodejs express4 - undefined session

我的問題是,即使在設置會話值的“ if”之后,我的會話也未在新層中定義。

/*******************************************/
/**/  var express         = require('express'),
/**/      cookieParser    = require('cookie-parser'),
/**/      session         = require('express-session'),
/**/      bodyParser      = require('body-parser'),
/**/      ejs             = require('ejs'),
/**/      mysql           = require('mysql'),
/**/      md5             = require('md5');
/*******************************************/

var app = express();
var connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: '',
  database: 'samurai'
});

connection.connect(function(error) {
  if(error) {
    console.log("There is a problem with connection to the database.");
    return;
  }
    console.log("Connected with a database.");
});

app.use(cookieParser());
app.use(session({
    secret: 'test session',
    resave: false,
    saveUninitialized: true
}));

var sess;

這里我的會話是不確定的(首先我進入“ / sign”地址):

app.get('/', function(req, res) {
  sess = req.session;
  console.log("sesja = "+sess.login); <--------------- undefined

  if(sess.login) {
    res.render('indexo');
  } else {
    res.render('index');
  }
});


app.post('/sign', function(req, res, next) {
    sess=req.session;

    var query = 'SELECT * FROM ?? where ??=? AND ??=?';
    var table = ["users", "name", req.body.login, "password", md5(req.body.password)];
    query = mysql.format(query, table);
    connection.query(query, function(err, rows) {
      if(err) {
        console.log(err);
        return;
      } else if(rows.length > 0) {
        console.log("You have been sucessfully logged in.");
        sess.login = req.body.login;
        console.log(sess.login); <------------ works fine
      } else {
        console.log("The name or password is incorrect.");
      }
    });
    console.log(sess.login); <---------------- here again undefined
    res.end();
});

問題僅在會話情況下,因為如果我在“ var sess”旁邊創建其他全局變量; (例如var test;),並在'/ sign'層的“ if”中為變量設置一個值,則“ test”將在其他層以及該“ if”之后可見。

最后一個問題:為什么session.login在“ if”之后和其他層中不可見? 如何正確設置? 您對創建會話有一些建議嗎?

謝謝你們的時間和幫助。

從http請求中設置全局變量是一件很邪惡的事,而且充滿了問題。 首先,您的服務器可以同時處理來自不同用戶的多個請求。 從這樣的請求中使用全局變量意味着不同的請求將“踩住”彼此的全局變量,隨之而來的是各種混亂和錯誤。

完全停止使用全局變量獲取會話信息。 如果您需要將會話信息傳遞給其他函數,則將其作為函數參數傳遞給他們。

其次,您必須了解node.js中的異步操作如何工作,以便有機會在node.js中成功編程。 您在異步編程中犯了多個錯誤,這就是為什么未在您認為應該設置的位置設置變量的主要原因之一。

在此代碼中:

app.post('/sign', function(req, res, next) {
    sess=req.session;

    var query = 'SELECT * FROM ?? where ??=? AND ??=?';
    var table = ["users", "name", req.body.login, "password", md5(req.body.password)];
    query = mysql.format(query, table);
    connection.query(query, function(err, rows) {
      if(err) {
        console.log(err);
        return;
      } else if(rows.length > 0) {
        console.log("You have been sucessfully logged in.");
        sess.login = req.body.login;
        console.log(sess.login); <------------ works fine
      } else {
        console.log("The name or password is incorrect.");
      }
    });
    // this is executed BEFORE the connection.query() callback is called
    console.log(sess.login); <---------------- here again undefined
    res.end();
});

connection.query()是異步的。 T'hat意味着它將在將來的某個時間調用其回調。 因此,您的console.log(sess.login); 在您的請求結束之前,回調已經被調用過。

您不確定在查詢的所有情況下到底要發生什么,但是這里概述了代碼的工作方式:

app.post('/sign', function(req, res, next) {
    var query = 'SELECT * FROM ?? where ??=? AND ??=?';
    var table = ["users", "name", req.body.login, "password", md5(req.body.password)];
    query = mysql.format(query, table);
    connection.query(query, function(err, rows) {
      if(err) {
        console.log(err);
        res.end("Query error");
      } else if(rows.length > 0) {
        res.end("Logged in successfully");
      } else {
        res.end("The name or password is incorrect.");
      }
    });
});

您可能會發現有關異步響應的一般性回答很有用: 如何從異步調用返回響應?

暫無
暫無

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

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