admin管理员组文章数量:1399932
I'm trying to build a vue app that searches through Spotify's API to find tracks. But I have a problem, it's saying :
Uncaught (in promise) TypeError: searchTracks is not a function
Whenever I called the searchTracks function. I looked for a solution but I can't seem to find it. I have the code to access Spotify's API (I'm still learning) on a different file (useSpotify.js)
import { ref } from 'vue'
const useSpotify = async () => {
let token
const id = 'MyId'
const secretId = 'mySecretId'
const res = await fetch('', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Basic ' + btoa(id + ':' + secretId)
},
body: 'grant_type=client_credentials'
});
token = await res.json();
console.log(token);
const searchTracks = async (searchTerm) => {
console.log(token)
const res = await fetch(`?${searchTerm}&type=track`, {
method: 'GET',
headers: { 'Authorization': 'Bearer ' + token }
});
const data = ref(null)
data.value = await res.json()
console.log(data.value)
return data.value
}
return { searchTracks }
}
export default useSpotify
And I'm calling it in the vue ponent just to try it (Login.vue) You can go to //searchTry to see the code done for this try
<template>
<form @submit.prevent="handleLoginSubmit">
<h3>Login</h3>
<input type="email" placeholder="Email" v-model="email" />
<input type="password" placeholder="Password" v-model="password" />
<div class="error" v-if="error">{{error}}</div>
<button v-if="!isPending">Login</button>
<button v-if="isPending" disabled>Loading..</button>
</form>
<input type="text" v-model="searchTerm">
<button @click="search">search</button>
</template>
<script>
import useLogin from "@/posables/useLogin";
import { ref } from '@vue/reactivity';
import { useRouter } from 'vue-router';
// searchTry
import useSpotify from '../../posables/spotifyApi/useSpotify'
// searchTry
export default {
setup() {
const {error, isPending, login} = useLogin()
const router = useRouter()
const email = ref('')
const password = ref('')
const handleLoginSubmit = async () =>{
const res = await login(email.value, password.value)
if(!error.value){
router.push({name: 'UserPlaylists'})
}
}
// search try
const searchTerm = ref('')
const {searchTracks} = useSpotify()
const search = async () =>{
const res = searchTracks(searchTerm.value)
}
// search try
return{email, password, isPending, error, handleLoginSubmit, searchTerm, search}
},
};
</script>
<style>
I don't understand where is the problem ing from. Please help (I'm still not good on javascript point me to the mistakes I've made)
I'm trying to build a vue app that searches through Spotify's API to find tracks. But I have a problem, it's saying :
Uncaught (in promise) TypeError: searchTracks is not a function
Whenever I called the searchTracks function. I looked for a solution but I can't seem to find it. I have the code to access Spotify's API (I'm still learning) on a different file (useSpotify.js)
import { ref } from 'vue'
const useSpotify = async () => {
let token
const id = 'MyId'
const secretId = 'mySecretId'
const res = await fetch('https://accounts.spotify./api/token', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Basic ' + btoa(id + ':' + secretId)
},
body: 'grant_type=client_credentials'
});
token = await res.json();
console.log(token);
const searchTracks = async (searchTerm) => {
console.log(token)
const res = await fetch(`https://api.spotify./v1/search?${searchTerm}&type=track`, {
method: 'GET',
headers: { 'Authorization': 'Bearer ' + token }
});
const data = ref(null)
data.value = await res.json()
console.log(data.value)
return data.value
}
return { searchTracks }
}
export default useSpotify
And I'm calling it in the vue ponent just to try it (Login.vue) You can go to //searchTry to see the code done for this try
<template>
<form @submit.prevent="handleLoginSubmit">
<h3>Login</h3>
<input type="email" placeholder="Email" v-model="email" />
<input type="password" placeholder="Password" v-model="password" />
<div class="error" v-if="error">{{error}}</div>
<button v-if="!isPending">Login</button>
<button v-if="isPending" disabled>Loading..</button>
</form>
<input type="text" v-model="searchTerm">
<button @click="search">search</button>
</template>
<script>
import useLogin from "@/posables/useLogin";
import { ref } from '@vue/reactivity';
import { useRouter } from 'vue-router';
// searchTry
import useSpotify from '../../posables/spotifyApi/useSpotify'
// searchTry
export default {
setup() {
const {error, isPending, login} = useLogin()
const router = useRouter()
const email = ref('')
const password = ref('')
const handleLoginSubmit = async () =>{
const res = await login(email.value, password.value)
if(!error.value){
router.push({name: 'UserPlaylists'})
}
}
// search try
const searchTerm = ref('')
const {searchTracks} = useSpotify()
const search = async () =>{
const res = searchTracks(searchTerm.value)
}
// search try
return{email, password, isPending, error, handleLoginSubmit, searchTerm, search}
},
};
</script>
<style>
I don't understand where is the problem ing from. Please help (I'm still not good on javascript point me to the mistakes I've made)
Share
Improve this question
asked Dec 1, 2021 at 13:20
madarawmadaraw
431 gold badge1 silver badge5 bronze badges
1
-
3
useSpotify
is async, but atconst {searchTracks} = useSpotify()
you are not awaiting its result. SosearchTracks
is most certainlyundefined
(and thus not a function). Either make the surrounding functionasync
and useawait useSpotify()
or use promisechaining withuseSpotify().then(result => ...)
– derpirscher Commented Dec 1, 2021 at 13:27
1 Answer
Reset to default 5You defined useSpotify as async
function, you should use await
or then()
when you call it. Response of async function is always promise. docs
useSpotify().then((result) => {
const {searchTracks} = result
// rest of your code
})
本文标签: javascriptUncaught (in promise) TypeError X is not a functionStack Overflow
版权声明:本文标题:javascript - Uncaught (in promise) TypeError: X is not a function - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744191107a2594520.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论