为了账号安全,请及时绑定邮箱和手机立即绑定

表达如何将值从 .js 承诺传递到 .ejs 视图

表达如何将值从 .js 承诺传递到 .ejs 视图

catspeake 2023-09-28 09:51:04
我试图将值从路由 js 文件(auth.js)传递到 ejs 视图(dashboard.ejs)这是 auth.js 中的代码:const express = require("express");const google = require('googleapis').google;const jwt = require('jsonwebtoken');const CONFIG = require("../config/passport-google");const nf = require('node-fetch');const router = express.Router();// Google's OAuth2 clientconst OAuth2 = google.auth.OAuth2;router.get("/youtube", function(req, res) {  // Create an OAuth2 client object from the credentials in our config file  const oauth2Client = new OAuth2(    CONFIG.oauth2Credentials.client_id,    CONFIG.oauth2Credentials.client_secret,    CONFIG.oauth2Credentials.redirect_uris[0]  );  // Obtain the google login link to which we'll send our users to give us access  const loginLink = oauth2Client.generateAuthUrl({    access_type: "offline", // Indicates that we need to be able to access data continously without the user constantly giving us consent    scope: CONFIG.oauth2Credentials.scopes // Using the access scopes from our config file  });  return res.render("./home/g-login", { loginLink: loginLink });});router.get("/youtube/callback", function(req, res) {  // Create an OAuth2 client object from the credentials in our config file  const oauth2Client = new OAuth2(    CONFIG.oauth2Credentials.client_id,    CONFIG.oauth2Credentials.client_secret,    CONFIG.oauth2Credentials.redirect_uris[0]  );  if (req.query.error) {    // The user did not give us permission.    return res.redirect("/");  } else {    oauth2Client.getToken(req.query.code, function(err, token) {      if (err) return res.redirect("/");      // Store the credentials given by google into a jsonwebtoken in a cookie called 'jwt'      res.cookie("jwt", jwt.sign(token, CONFIG.JWTsecret));diomerda 变量是一个承诺,我已经通过 service.subscriptions 下面的函数渲染视图(它正确地将订阅值发送到仪表板视图),那么我如何也将我的 diomerda 变量传递到该视图?我正在尝试,module.exports正如您在代码中看到的那样,但似乎我无法require在 ejs 文件内使用
查看完整描述

1 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

请在下面的代码中找到mark1和mark2。


mark1:您不需要导出此方法,只需在渲染 ejs 视图之前使用它即可。当你在这个函数中返回你的json时,你不需要在这里添加额外的await。


mark2:我将get_data函数放在这里是因为我看到你在router.get("/youtube/callback"). 因此,在向用户呈现 ejs 视图之前,您需要调用get_data函数来获取所需的数据。然后,只需用数据渲染它即可。


router.get("/youtube/callback", function(req, res) {

    // Create an OAuth2 client object from the credentials in our config file

    const oauth2Client = new OAuth2(

      CONFIG.oauth2Credentials.client_id,

      CONFIG.oauth2Credentials.client_secret,

      CONFIG.oauth2Credentials.redirect_uris[0]

    );

  

    if (req.query.error) {

      // The user did not give us permission.

      return res.redirect("/");

    } else {

      oauth2Client.getToken(req.query.code, function(err, token) {

        if (err) return res.redirect("/");

  

        // Store the credentials given by google into a jsonwebtoken in a cookie called 'jwt'

        res.cookie("jwt", jwt.sign(token, CONFIG.JWTsecret));

        

        // return res.redirect("/get_some_data");

  

        if (!req.cookies.jwt) {

          // We haven't logged in

          return res.redirect("/");

        }

      

        // Add this specific user's credentials to our OAuth2 client

        oauth2Client.credentials = jwt.verify(req.cookies.jwt, CONFIG.JWTsecret);

      

        // Get the youtube service

        const service = google.youtube("v3");

  

        const url = `https://www.googleapis.com/oauth2/v1/userinfo?access_token=${token[Object.keys(token)[0]]}`;

  

        // ================ mark 1 ====================

        const get_data = async () => {

          try {

            const response = await nf(url);

            const json = await response.json();

            return json;

          } catch (error) {

            console.log(error);

          }

        };

  

        // Get 50 of the user's subscriptions (the channels they're subscribed to)

        service.subscriptions

          .list({

            auth: oauth2Client,

            mine: true,

            part: "snippet,contentDetails",

            maxResults: 50

          })

          // ================ mark 2 ====================

          // remember to add async here

          .then(async (response) => { 

             // ================ mark 2 ====================

             const diomerda = await get_data()

  

            // Render the profile view, passing the subscriptions to it

            return res.render("./user/dashboard", { subscriptions: response.data.items, diomerda: diomerda });

          });

  

      });

    }

  });


查看完整回答
反对 回复 2023-09-28
  • 1 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信