Appearance
Fetching Data
Most front-end applications need a way to get data from the back end services they leverage.
Fetch
Looks like there is a newer built in method, fetch
to make a query:
https://duckduckgo.com/?t=ffab&q=do+we+still+need+axios+with+fetch+api+available%3F&ia=web
do we still need axios with fetch api available? at DuckDuckGo
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
Fetch API - Web APIs | MDN
https://blog.logrocket.com/axios-or-fetch-api/
Axios or fetch(): Which should you use? - LogRocket Blog
Fetch may be a little bit more verbose, but only slightly
Axios
Axios seems to be the way to go
npm add axios
then use it:
<script>
import axios from 'axios'
export default {
async asyncData ({ params }) {
let { data } = await axios.get(`http://localhost:3000/index.json`)
return { items: data }
},
<script>
import axios from 'axios'
export default {
async asyncData ({ params }) {
let { data } = await axios.get(`http://localhost:3000/index.json`)
return { items: data }
},
Be sure to enable requests on the back-end server:
https://stackoverflow.com/questions/17262170/bottle-py-enabling-cors-for-jquery-ajax-requests
https://axios.nuxtjs.org/usage/ Usage - Axios Module https://github.com/axios/axios axios/axios: Promise based HTTP client for the browser and node.js
GET vs POST
GET requests expect a 'params' option
axios
.get(`${apiUrl}/verify`, {
params: {
ticket: ticket,
service: this.$store.state.globals.Return,
}
})
axios
.get(`${apiUrl}/verify`, {
params: {
ticket: ticket,
service: this.$store.state.globals.Return,
}
})
POST requests pass the second attribute to the API
axios
.post(`${apiUrl}/authentication`, {
ticket: ticket,
service: this.$store.state.globals.Return,
})
axios
.post(`${apiUrl}/authentication`, {
ticket: ticket,
service: this.$store.state.globals.Return,
})
Errors
You can still catch errors with await calls by chaining the calls to catch
, similar to the way you would with promises.
https://duckduckgo.com/?t=canonical&q=how+to+catch+error+with+await&ia=web how to catch error with await at DuckDuckGo https://dev.to/sobiodarlington/better-error-handling-with-async-await-2e5m Better error handling with async/await - DEV https://stackoverflow.com/questions/33562284/how-do-i-catch-thrown-errors-with-async-await javascript - How do I catch thrown errors with async / await? - Stack Overflow
Nuxt
Remote calls
In a method, you can make remote calls with something like
const ip = await this.$axios.$get('http://icanhazip.com')
https://axios.nuxtjs.org/usage/
Nuxt comes with special functions for handling axios requests when called from a server side rendering context.
fetch
https://nuxtjs.org/blog/understanding-how-fetch-works-in-nuxt-2-12
Fetch is an improved method for retrieving data.
The component context is available. Assignments to data in the local context can be made directly with this approach (via this
).
asyncData
The component context is not available directly in asyncData, so a context must be passed in. The return value will eventually get merged in with the component's data.
https://nuxtjs.org/guide/async-data/
Gotchas
If you get an error like:
ECONNREFUSED 127.0.0.1:8888at TCPConnectWrap.afterConnect
The nuxt server may be initiating the axios call for server side rendering. If you're using a containerized setup with nginx acting as a proxy, the source address may be different relative to the server. To get around this, specify a different source based on context (server vs client). You can also use a method that gets called on mounted so it only runs on the client. (skip server rendering)
Wrap request in if (process.server)
within the retrieval methods of the page
let urlPrefix
if (process.server) {
urlPrefix = context.$config.apiUrlSSR
} else {
urlPrefix = context.$config.apiUrl
}
const personData = await context.$axios.get(
urlPrefix + 'user/details/' + context.params.id
)
return {
person: personData.data,
}
let urlPrefix
if (process.server) {
urlPrefix = context.$config.apiUrlSSR
} else {
urlPrefix = context.$config.apiUrl
}
const personData = await context.$axios.get(
urlPrefix + 'user/details/' + context.params.id
)
return {
person: personData.data,
}
https://stackoverflow.com/questions/61354470/nuxt-fetching-data-only-on-server-side
More configuration options