Javascript Express应用程序中的API调用
我正在关注这一点。我想复制相同的,但我想用Last.fm API代替TVDB。所以我将server.js代码从改为包含方法 但每当我添加任何相册名称时,我都会得到TypeError:无法读取未定义的属性“results” at/home/karan/work/showapp/server.js:94:22Javascript Express应用程序中的API调用,javascript,node.js,mongodb,express,last.fm,Javascript,Node.js,Mongodb,Express,Last.fm,我正在关注这一点。我想复制相同的,但我想用Last.fm API代替TVDB。所以我将server.js代码从改为包含方法 但每当我添加任何相册名称时,我都会得到TypeError:无法读取未定义的属性“results” at/home/karan/work/showapp/server.js:94:22 我还更改了数据库模式。我不明白是什么引起了这个问题。API调用是否构造不正确 不要添加3页代码。仅包括相关部分。错误指向前的最后一个值。结果,因为未定义的值不能有属性。因此,无论是result
我还更改了数据库模式。我不明白是什么引起了这个问题。API调用是否构造不正确 不要添加3页代码。仅包括相关部分。错误指向
前的最后一个值。结果
,因为未定义的
值不能有属性。因此,无论是result
(对于result.results
)还是result.Request
(对于result.Request.results
)都是未定义的。考虑到API中有多少结果看起来是小写的,最好的猜测是result.Request
应该是result.Request
。不过,您还应该检查err
s.error这里也有->request.get('http://www.goodreads.com/book/show/50?format=xml&key=“+apiKey+函数(错误、响应、正文)
。您正在将函数连接到请求url上
var express = require('express');
var path = require('path');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var bcrypt = require('bcryptjs');
var async = require('async');
var request = require('request');
var xml2js = require('xml2js');
var _ = require('lodash');
var showSchema = new mongoose.Schema({
_id: Number,
name: String,
});
var userSchema = new mongoose.Schema({
name: { type: String, trim: true, required: true },
email: { type: String, unique: true, lowercase: true, trim: true },
password: String,
facebook: {
id: String,
email: String
},
google: {
id: String,
email: String
}
});
var User = mongoose.model('User', userSchema);
var Show = mongoose.model('Show', showSchema);
mongoose.connect('mongodb://sahat:foobar@ds041178.mongolab.com:41178/showtrackrdemo');
var app = express();
app.set('port', process.env.PORT || 3000);
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
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.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 });
});
app.post('/api/shows', function (req, res, next) {
var seriesName = req.body.showName;
var apiKey = ' 7b3e1e72b5e06503e298ce018c407cc5';
var parser = xml2js.Parser({
explicitArray: false,
normalizeTags: true
});
//http://ws.audioscrobbler.com/2.0/?method=album.search&album=believe&api_key=7b3e1e72b5e06503e298ce018c407cc5&format=json
async.waterfall([
function (callback) {
request.get('http://ws.audioscrobbler.com/2.0/?method=album.search&album='+ seriesName+'&api_key='+apiKey+'&format=json', function (error, response, body) {
if (error) return next(error);
parser.parseString(body, function (err, result) {
if (!result.results.albummatches.album.name) {
return res.send(400, { message: req.body.showName + ' was not found.' });
}
var seriesId = result.results.albummatches.album.id;
callback(err, seriesId);
});
});
},
//http://ws.audioscrobbler.com/2.0/?method=album.search&album=
function (seriesId, callback) {
request.get('http://www.goodreads.com/book/show/50?format=xml&key=' + apiKey + function (error, response, body) {
if (error) return next(error);
parser.parseString(body, function (err, result) {
var series = result.Request.results.work[0];
var show = new Show({
_id: result.results.albummatches.album.id,
name:result.results.albummatches.album.name
});
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);
}
var alertDate = Date.create('Next ' + show.airsDayOfWeek + ' at ' + show.airsTime).rewind({ hour: 2});
agenda.schedule(alertDate, 'send email alert', show.name).repeatEvery('1 week');
res.send(200);
});
});
});