无法在 .then 函数 js 中将属性设置为 req.session

问题描述 投票:0回答:0

我正在使用 spotify web API 开发一个 web 应用程序。 我是使用节点 js 的初学者,我试图将在 spotifyContent.js 中计算的值传递给 index.js,以便使用数据呈现视图,但是当尝试在音频调用中设置 req.session.key 时-曲目特征我无法在 index.js 中检索它,它保持未定义

console log

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

console log

javascript node.js spotify express-session
© www.soinside.com 2019 - 2024. All rights reserved.