Arrays 如何读取nodejs中从req.session加载的数组长度?

Arrays 如何读取nodejs中从req.session加载的数组长度?,arrays,node.js,session,express,Arrays,Node.js,Session,Express,我的代码在我的post请求中如下所示: var titles = []; movies.forEach(function(movie) { // If title exists in array, dont push. if(titles.indexOf(movie.title) > -1){ console.log('skipped duplicate title of '+movie.ti

我的代码在我的post请求中如下所示:

var titles = [];
        movies.forEach(function(movie) {

            // If title exists in array, dont push.
            if(titles.indexOf(movie.title) > -1){
                console.log('skipped duplicate title of '+movie.title);

            }
            else{
                titles.push(movie.title);
                console.log('pushed '+movie.title);
            }
        });

        req.session.titles = titles;
        console.log(req.session.titles);
我的get请求如下所示:

app.get('/search', function(req, res) {
    var arr = req.session.titles;
    if(arr.length > 0) {
    //do something
}
但是我得到了错误
TypeError:cannotreadproperty'length'of undefined at Object

我的server.js看起来像这样。我认为这些课程不起作用。。我做错了什么? 我想我以前有过会话,我已经安装了所有的软件包

我的req.session.titles如评论中所示为空

// server.js

// set up ======================================================================
// get all the tools we need
var express  = require('express');
var app      = express();
var port     = process.env.PORT || 3003;
var mongoose = require('mongoose');
var passport = require('passport');
var flash    = require('connect-flash');
var fs       = require('fs');
var morgan       = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser   = require('body-parser');
var session      = require('express-session');
//var Parse = require('../app/models/parse');

var configDB = require('./config/database.js');

// configuration ===============================================================
mongoose.connect(configDB.url); // connect to our database

require('./config/passport')(passport); // pass passport for configuration

// set up our express application
app.use(morgan('dev')); // log every request to the console
app.use(cookieParser()); // read cookies (needed for auth)
app.use(bodyParser.json()); // get information from html forms
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static(__dirname + '/public'));

app.set('view engine', 'ejs'); // set up ejs for templating

// required for passport
app.use(session({
  secret: 'hakunamatata',
  resave: false,
  saveUninitialized: true
}));
app.use(cookieParser());
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions
app.use(flash()); // use connect-flash for flash messages stored in session

// routes ======================================================================
require('./app/routes.js')(app, passport); // load our routes and pass in our app and fully configured passport

// set the default tmpdir for uploads (IMPORTANT)
process.env.TMPDIR = './tmp';

//load all files in models dir
fs.readdirSync(__dirname + '/app/models').forEach(function(filename) {
    if (~filename.indexOf('js')) require(__dirname + '/app/models/' + filename)
});

// launch ======================================================================
app.listen(port);

我可以在var titles=[]行中看到一个错误; 在这里,您实际上删除了每个帖子请求的标题。你应该做的是写作

var titles = req.session.titles || [];
还可以执行app.use(cookieParser());两次


不要认为修复这两个错误会解决问题,但无论如何,它们都会解决问题。

问题不在我的会话中,而是在omdb api向会话变量读取数据之前执行的get请求中。因此,会话变量在我尝试访问它之前没有设置

我使用回调函数来解决这个问题


链接到这个问题以及我是如何解决的。

很明显,arr没有定义,而req.session.titles也没有定义。调试req.session中的内容并检查会话是否正常工作。您是否使用app.use(会话)、app.use(cookie\u解析器)?您将会话存储在何处?使用一些代码进行了更新,您知道原因是什么吗?我不清楚您在代码中的何处运行填充标题数组的代码。我在routes.js中运行它,我有上面的代码。这是我运行titles.push(movie.title)的部分,然后用req.session.titles=titles将其保存到会话。这是来自omdb api for nodejs的标题数组。当我查看终端时,我在得到结果之前执行了console.log命令。。所以我可能在从API下载所有结果之前重定向页面,这可能吗?在get请求中,我有一个console.log,上面写着“会话到了”+req.session.titles。我在post请求中看到打印之前,包含应该在…之前执行的结果电影。我应该在每个post请求中删除它;)