Yêu cầu thg 9 27, 2022 4:19 SA 143 0 2
  • 143 0 2
+1

Làm sao để lấy một giá trị trong mảng bằng function không bị lỗi?

Chia sẻ
  • 143 0 2

Em đang có một function để lấy data trả về ntn:

async function getAccessToken () {
  let accessTokenInit = await oauth2Client.getAccessToken()
  let accessToken = JSON.stringify(accessTokenInit)
  
  return accessToken
}

Nó sẽ trả ra mảng như sau:

image.png

Và đây là đoạn code em cần lấy cái giá trị accesstoken trong "token": value nhưng em thử return về accessToken.data.access_token không được...

  email: {
    provider: env(`${process.env.REACT_APP_EMAIL_PROVIDER}`),
    providerOptions: {
      host: env("EMAIL_SMTP_HOST", "smtp.gmail.com"),
      port: env("EMAIL_SMTP_PORT", 587),
      auth: {
        type: "OAuth2",
        user: "hjhjhj1i2i@gmail.com",
        clientId: `"${process.env.CLIENT_ID }"`,
        clientSecret: `${process.env.CLIENT_SECRET}`,
        refreshToken: `${process.env.REFRESH_TOKEN}`,
        accessToken: await getAccessToken(),       
      },
    },
    }

vậy có cách nào để em get đc cái giá trị rồi gán xuống acessToken không ạ?

2 CÂU TRẢ LỜI


Đã trả lời thg 9 27, 2022 4:25 SA
+2

Mình thấy access_token của bạn nằm ở trong res->data->access_token nên bạn muốn lấy phải là: accessToken.res.data.access_token chứ.

Chia sẻ
Avatar GhostYYY @bvk199x
thg 9 27, 2022 4:28 SA
Avatar GhostYYY @bvk199x
thg 9 27, 2022 4:36 SA

Mình vừa thử log accessToken thì nó vẫn log ra bình thường mà thử accessToken.token thì nó lại ra undefined @giang.nt ._.

thg 9 27, 2022 4:46 SA

@bvk199x Lúc nãy mình nhầm cái token của bạn giống access_token. Nên bạn muốn lấy access_token thì phải là accessToken.res.data.access_token mới lấy được access_token nhé!

thg 9 27, 2022 4:48 SA

@bvk199x Bạn có thể tạo thêm 1 biến để gán access_token kiểu:

async function getAccessToken () {
  let accessTokenInit = await oauth2Client.getAccessToken()
  let getAccessToken = JSON.stringify(accessTokenInit)
   let accessToken = getAccessToken.res.data.access_token
  return accessToken
}
Avatar GhostYYY @bvk199x
thg 9 27, 2022 4:49 SA

@giang.nt thực ra giống tại mình xoá bớt ý :3

thg 9 27, 2022 4:53 SA

@bvk199x Vậy theo câu hỏi của bạn ở trên kia thì mình đang hiểu là cái accessToken trả về cái mảng ở dưới và bạn đang muốn lấy cái access_token ở trong accessToken kia. Vậy thì bạn chỉ cần trả về accessToken.res.data.access_token là ok mà nhỉ?

Avatar GhostYYY @bvk199x
thg 9 27, 2022 4:55 SA

@giang.nt mình thử rồi nó vẫn ra undefined bên stackoverflow ngta có nói ntn á b

image.png

thg 9 27, 2022 4:59 SA
thg 9 27, 2022 5:04 SA

@bvk199x Vậy bạn chỉ cần xóa

let accessToken = JSON.stringify(accessTokenInit)

vì đoạn này bạn đang convert về JSON

Avatar GhostYYY @bvk199x
thg 9 27, 2022 7:01 SA

@giang.nt Đúng gòi á b, mà hình như dưới thằng email vẫn không nhận được cái token kia ._.

Đã trả lời thg 9 27, 2022 7:36 SA
+1

Cái đoạn code của bạn đang trả về string chứ không phải object:

async function getAccessToken () {
  let accessTokenInit = await oauth2Client.getAccessToken()
  let accessToken = JSON.stringify(accessTokenInit)
  
  return accessToken
}

Bạn thử log cái accessTokenInit ra console, nếu là accessTokenInit là string thì bạn dùng JSON.parse(accessTokenInit). Kiểu như này:

async function getAccessToken () {
  let accessTokenInit = await oauth2Client.getAccessToken()
  let accessToken = typeof accessTokenInit === 'string' ? JSON.parse(accessTokenInit) : accessTokenInit;
  
  return accessToken.res.data.access_token;
}

getAccessToken()
.then((accessToken) => {
  console.log(accessToken)
});

// const accessToken = await getAccessToken();
Chia sẻ
Avatar GhostYYY @bvk199x
thg 9 27, 2022 7:55 SA

@huukimit vâng e đã fix và log ra đúng r a, a có thể xem giúp em nếu em async await như trên thì em có lấy đc cái giá trị trong acess_token không ạ? em chạy thì nó vẫn báo acesstk sai trong khi em log ra r gán thẳng vào thì chạy được

thg 9 27, 2022 7:58 SA

@bvk199x Bạn gửi đoạn code sử dụng hàm getAccessToken lên xem.

Avatar GhostYYY @bvk199x
thg 9 27, 2022 8:03 SA

@huukimit hàm getAccess thì em dùng ở ngay dưới luôn ạ nó ntn nhưng ở trong module.exports ._.

const nodemailer = require("nodemailer");
const { google } = require("googleapis");
const OAuth2 = google.auth.OAuth2;
const oauth2Client = new OAuth2(
  `${process.env.CLIENT_ID }`,
  `${process.env.CLIENT_SECRET}`,
  "https://developers.google.com/oauthplayground",
  
);
oauth2Client.setCredentials({
  refresh_token: `${process.env.REFRESH_TOKEN}`,
});
const accessToken = oauth2Client.getAccessToken()

async function getAccessToken () {
  let accessToken = await oauth2Client.getAccessToken()
  // let getAccessToken = JSON.stringify(accessTokenInit)
  strapi.log.debug(`Aceess token ${JSON.stringify(accessToken.token)}`)
  return accessToken.token

}
module.exports = async ({ env }) => ({
  // ...
  email: {
    provider: env(`${process.env.REACT_APP_EMAIL_PROVIDER}`),
    providerOptions: {
      host: env("EMAIL_SMTP_HOST", "smtp.gmail.com"),
      port: env("EMAIL_SMTP_PORT", 587),
      auth: {
        type: "OAuth2",
        user: "hotrodhv58@gmail.com",
        clientId: `"${process.env.CLIENT_ID }"`,
        clientSecret: `${process.env.CLIENT_SECRET}`,
        refreshToken: `${process.env.REFRESH_TOKEN}`,
        accessToken: await getAccessToken()
        
      },
    },
    settings: {
      defaultFrom: env(`${process.env.REACT_APP_EMAIL_ADDRESS_FROM}`),
      defaultReplyTo: env(`${process.env.REACT_APP_EMAIL_ADDRESS_REPLY}`),
    },
  },
  
  // ...
  
});
thg 9 27, 2022 8:24 SA
thg 9 27, 2022 9:16 SA

Dùng như kia là OK rồi nhé bạn. Giờ bạn chỉ cần đảm bảo cái string trả về của getAccessToken() là access token hợp lệ là OK.

thg 9 27, 2022 9:18 SA

Bạn thử chạy code hàm getAccessToken, xong copy cái trả về từ hàm này lên playground gửi thử một vài request xem hoạt động được không.

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí