为什么我从server.js文件中得到null或[]响应?

时间:2015-11-03 04:53:20

标签: javascript angularjs node.js mongodb

我一直在做一个基于TV showTracker的例子,到目前为止我无法在我的网站上看到任何节目。我一直在努力思考是否犯了错误,但我仍然找不到任何东西。那么如何检索这些信息。我已经将这个server.js和mongod盯在另外的CMD中并且吞噬了另一个CMD我仍然无法获得任何节目。当我看到响应时,它会像这样显示一个空白数组“[]”。有什么建议吗?帮助将非常感激。 (我已经主持了网站,认为这对我的问题也有帮助)。 net调试器中的错误表示api / shows / - response = []

这是我的server.jsrespone

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'));
});

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.post('/api/shows', function (req, res, next) {
    var apiKey = 'E36B52F7E036AFF3';
    var seriesName = req.body.showName
    .toLowerCase()
    .replace(/ /g, '_')
    .replace(/[^\w-]+/g, '');
    var parser = xml2js.Parser({
        explicitArray: false,
        normalizeTags: true

    });

    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);
        });
    });
});

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

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



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 });
});

2 个答案:

答案 0 :(得分:0)

将/ api / shows中的var query = Show.find();更改为

var query  = Show.find(function(err, showdata){
    // all the checking and the res.send(shows) goes here
})

只需等待数据并执行所有操作(异步)

答案 1 :(得分:0)

好的伙计们,我终于找到了问题的答案。脚本(server.js)没什么问题。这是因为我认为它不能保存数据库中的数据('localhost:27017/test')。这就是为什么我可能从TVDB API获得null响应。一旦我更改了数据库并将字符串连接到(

  

'mongodb://nixsiow:abcd1234@ds027479.mongolab.com:27479/nixshowtrackrapp'   ,它就像一个魅力。

所以也许我的答案可能无法正确解释,或者你可以在堆栈溢出中查找更多细节。谢谢你的帮助。我希望这可以帮助那些尝试完成本教程的人,并坚持这一步。

最后答案:

mongoose.connect('mongodb://nixsiow:abcd1234@ds027479.mongolab.com:27479/nixshowtrackrapp');

var agenda = require('agenda')({ db: { address: 'mongodb://nixsiow:abcd1234@ds027479.mongolab.com:27479/nixshowtrackrapp'  } }); 

此外Nixsow's website可能有帮助,这是我在本教程中找到的最新更新。