我正在使用 spotify web API 开发一个 web 应用程序。 我是使用节点 js 的初学者,我试图将在 spotifyContent.js 中计算的值传递给 index.js,以便使用数据呈现视图,但是当尝试在音频调用中设置 req.session.key 时-曲目特征我无法在 index.js 中检索它,它保持未定义
spotifyContent.js 中的函数
// callback to get the data needed
module.exports.spotifyCallback = function (req, res) {
spotifyApi
.authorizationCodeGrant(req.query.code)
.then(
function (data) {
spotifyApi.setAccessToken(data.body["access_token"]);
spotifyApi.setRefreshToken(data.body["refresh_token"]);
return spotifyApi.getMe;
},
function (err) {
console.log("Something went wrong!", err);
}
)
.then(function (data) {
spotifyApi
.getMyRecentlyPlayedTracks({
limit: 50,
})
.then(function (data) {
// we will not need every info from the response
var songs = [];
var dateF = Date.parse(data.body.items[0].played_at);
var dateI = Date.parse(
data.body.items[data.body.items.length - 1].played_at
);
var activity = (dateF - dateI) / 1000 / 60 / 60; // convert milliseconds to hours
data.body.items.forEach(function (item) {
songs.push(item.track.id); // we stock IDs to get the song rec later
});
var density = 0;
///////// calculate density ////////
if (activity < 10) density = getRandomInt(131, 201);
else if (activity < 20) density = getRandomInt(101, 131);
else if (activity < 35) density = getRandomInt(51, 101);
else if (activity > 35) density = getRandomInt(21, 51);
req.session.density = density; // works
///////// get the key that was listened to the most///////////
spotifyApi.getAudioFeaturesForTracks(songs).then(function (data) {
var keys = [];
data.body.audio_features.forEach(function (f) {
keys.push(f.key);
});
req.session.key = getMax(occurences(keys)); // is not passed to req.session
});
res.redirect("/myApp");
});
});
};
index.js
var express = require("express");
var spotifyContent = require("../SpotifyContent/SpotifyContent");
var router = express.Router();
/* GET home page */
router.get("/", function (req, res, next) {
res.render("index", {
title: "myApp",
});
});
router.get("/login", function (req, res) {
spotifyContent.spotifyLogin(res);
});
router.get("/callback", function (req, res) {
spotifyContent.spotifyCallback(req, res);
});
router.get("/myApp", function (req, res, next) {
console.log("key = " + req.session.key);
console.log("density = " + req.session.density);
res.render("record", {
title: "myApp",
key: req.session.key,
density: req.session.density,
});
});
module.exports = router;
app.js
var express = require("express"); // Express web server framework
var request = require("request"); // "Request" library
var cors = require("cors");
var querystring = require("querystring");
var cookieParser = require("cookie-parser");
var session = require("express-session");
var index = require("./routes/index");
var app = express();
app.use(
session({
cookie: {
path: "/",
},
secret: "secret",
resave: true,
saveUninitialized: true,
})
);
app
.use(express.static(__dirname + "/public"))
.use(cors())
.use(cookieParser())
.use("/", index);
app.set("view engine", "ejs");
console.log("Listening on 8888");
app.listen(8888);
获取出现最多的值的函数,我尝试用像 3 这样的简单值替换,但它保持未定义,除非我在 getAudioFeaturesFromTracks 函数之外设置属性。 我还尝试检索键值以将属性设置为与 req.session.density 相同的函数,但找不到有效的方法。
当我更改对 req.session.key 的调用时:
.then(function (data) {
// we will not need every info from the response
var songs = [];
var dateF = Date.parse(data.body.items[0].played_at);
var dateI = Date.parse(
data.body.items[data.body.items.length - 1].played_at
);
var activity = (dateF - dateI) / 1000 / 60 / 60; // convert milliseconds to hours
data.body.items.forEach(function (item) {
songs.push(item.track.id); // we stock IDs to get the song rec later
});
var density = 0;
///////// calculate density ////////
if (activity < 10) density = getRandomInt(131, 201);
else if (activity < 20) density = getRandomInt(101, 131);
else if (activity < 35) density = getRandomInt(51, 101);
else if (activity > 35) density = getRandomInt(21, 51);
req.session.density = density;
///////// get the key that was listened to the most///////////
spotifyApi.getAudioFeaturesForTracks(songs).then(function (data) {
var keys = [];
data.body.audio_features.forEach(function (f) {
keys.push(f.key);
});
// req.session.key = 3;
});
req.session.key = 3;
res.redirect("/myApp");
});
});
};