server.js中的错误无法处理模块' cookie'?

时间:2015-11-01 06:15:57

标签: javascript node.js cookies express

我在这里根据示例制作了一个网站,并且我正在尝试实现该服务器。虽然它完美地工作,但在我添加了认证和& cookie代码server.js停止工作说无法找到模块' cookie',我认为这与express-session

有关

这是我的server.js代码;

var mongoose = require('mongoose');
var bcrypt = require('bcryptjs');
var express = require('express');
var path = require('path');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

var showSchema = new mongoose.Schema(
    {
        _id: Number,
        name: String,
        airsDayofWeek: String,
        airsTime: String,
        firstAired: Date,
        genre: [String],
        network: String,
        overview: String,
        rating: Number,
        ratingCount: Number,
        status: String,
        poster: String,
        subscribers: [{
                type: mongoose.Schema.Types.ObjectId,
                ref: 'User'
            }],
        episodes: [{
                season: Number,
                episodeNumber: Number,
                episodeName: String,
                firstAired: Date,
                overview: String
            }]
    });

var userSchema = new mongoose.Schema(
    {
        email: { type: String, unique: true },
        password: String
    });

userSchema.pre('save', function (next) {
    var user = this;
    if (!user.isModified('password')) return next();
    bcrypt.genSalt(10, function (err, salt) {
        if (err) return next(err);
        bcrypt.hash(user.password, salt, function (err, hash) {
            if (err) return next(err);
            user.password = hash;
            next();
        });
    });
});

userSchema.methods.comparePassword = function (candidatePassword, cb) {
    bcrypt.compare(candidatePassword, this.password, function (err, isMatch) {
        if (err) return cb(err);
        cb(null, isMatch);
    });
}

var User = mongoose.model('User', userSchema);
var Show = mongoose.model('Show', showSchema);

mongoose.connect('localhost');

var app = express();

app.set('port', process.env.PORT || 3000);
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:false}));
app.use(cookieParser());
app.use(session({ secret: 'keyboard cat' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(path.join(__dirname, 'public')));

app.listen(app.get('port'), function () {
    console.log('Express server listening on port ' + app.get('port'));
});

function ensureAuthenticated(req, res, next) {
    if (req.isAuthenticated()) next();
    else res.send(401);
};

passport.use(new new LocalStrategy({ usernameField: 'email' }, function (email, password, done) {
    User.findOne({ email: email }, function (err, user) {
        if (err) return done(err);
        if (!user) return done(null, false);
        user.comparePassword(password, function (err, isMatch) {
            if (err) return done(err);
            if (isMatch) return done(null, user);
            return done(null, false);
        });
    });
}));



app.get('/api/shows', function (req, res, next) {
    var query = Show.find();
    if (req.query.genre) {
        query.where({ genre: req.query.genre });
    }
    else if (req.query.alphabet) {
        query.where({ name: new RegExp('^' + '[' + req.query.alphabet + ']', 'i') });

    }
    else {
        query.limit(12);
    }
    query.exec(function (err, shows) {
        if (err) return next(err);
        res.send(shows);
    });

});

app.get('/api/shows/:id', function (req, res, next) {
    Show.findById(req.params.id, function (err, show) {
        if (err) return next(err);
        res.send(show);
    });
});

app.use(function (req, res, next) {
    if (req.user) {
        res.cookie('user', JSON.stringify(req.user));
    }
    next();
});

app.post('/api/shows', function (req, res, next) {
    var apiKey = '4B8EA1DCA9C6B577';
    var parser = xml2js.Parser({
        explicitArray: false,
        normalizeTags: true
    });
    var seriesName = req.body.showName
    .toLowerCase()
    .replace(/ /g, '_')
    .replace(/[^\w-]+/g, '');

    async.waterfall([
        function (callback) {
            request.get('http://thetvdb.com/api/GetSeries.php?seriesname=' + seriesName, function (error, response, body) {
                if (error) return next(error);
                parser.parseString(body, function (err, result) {
                    if (!result.data.series) {
                        return res.send(404, { message: req.body.showName + ' was not found.' });
                    }
                    var seriesId = result.data.series.seriesid || result.data.series[0].seriesid;
                    callback(err, seriesId);
                });
            });
        },
        function (seriesId, callback) {
            request.get('http://thetvdb.com/api/' + apiKey + '/series/' + seriesId + '/all/en.xml', function (error, response, body) {
                if (error) return next(error);
                parser.parseString(body, function (err, result) {
                    var series = result.data.series;
                    var episodes = result.data.episode;
                    var show = new Show({
                        _id: series.id,
                        name: series.seriesname,
                        airsDayOfWeek: series.airs_dayofweek,
                        airsTime: series.airs_time,
                        firstAired: series.firstaired,
                        genre: series.genre.split('|').filter(Boolean),
                        network: series.network,
                        overview: series.overview,
                        rating: series.rating,
                        ratingCount: series.ratingcount,
                        runtime: series.runtime,
                        status: series.status,
                        poster: series.poster,
                        episodes: []
                    });
                    _.each(episodes, function (episode) {
                        show.episodes.push({
                            season: episode.seasonnumber,
                            episodeNumber: episode.episodenumber,
                            episodeName: episode.episodename,
                            firstAired: episode.firstaired,
                            overview: episode.overview
                        });
                    });
                    callback(err, show);
                });
            });
        },
        function (show, callback) {
            var url = 'http://thetvdb.com/banners/' + show.poster;
            request({ url: url, encoding: null }, function (error, response, body) {
                show.poster = 'data:' + response.headers['content-type'] + ';base64,' + body.toString('base64');
                callback(error, show);
            });
        }
    ], function (err, show) {
        if (err) return next(err);
        show.save(function (err) {
            if (err) {
                if (err.code == 11000) {
                    return res.send(409, { message: show.name + ' already exists.' });
                }
                return next(err);
            }
            res.send(200);
        });
    });
});

app.post('/api/login', passport.authenticate('local'), function (req, res){
    res.cookie('user', JSON.stringify(req.user));
    res.send(req.user);
})

app.post('/api/signup', function (req, res, next) {
    var user = new User({
        email: req.body.email,
        password: req.boy.password
    });
    user.save(function (err) {
        if (err) return next(err);
        res.send(200);
    });
});

app.get('/api/logout', function (req, res, next) {
    req.logout();
    res.send(200);
});


app.get('*',function (req, res){
    res.redirect('/#' + req.originalUrl);
})

app.use(function (err, req, res, next) {
    console.error(err.stack);
    res.send(500, { message: err.message });
});


passport.serializeUser(function (user, done) {
    done(null, user, id);
});

passport.deserializeUser(function (id, done) {
    User.findById(id, function (err, user) {
        done(err, user);
    });
});

即使我改变了代码的位置仍然无效。我错过了一些模块吗?或者以错误的顺序放置代码。我是node.js的初学者,所以任何帮助都会受到赞赏。

0 个答案:

没有答案