Got error 422 with vuex (dispatch) in vuejs - vue.js

I got an error :
422 (Unprocessable Content)
when I tried to post a data in register form
I have this in my Register.vue
methods: {
register() {
this.$store.dispatch('register', {
firstname: this.firstname,
lastname: this.lastname,
email: this.email,
password: this.password,
});
},
},
};
and in my vuex
actions: {
register(credentials) {
const requestOptions = {
method: 'POST',
headers: { 'content-type': 'application/json' },
dataType: 'json',
body: JSON.stringify(credentials),
};
console.log(credentials);
return fetch('http://localhost/api/users', requestOptions)
.then((response) => {
return response.json;
})
.catch((err) => console.log(err.message));
},
}
Anyone know where I'm wrong ?
Many thanks

Don't return twice if the request is good.
actions: {
register(credentials) {
const requestOptions = {
method: 'POST',
headers: { 'content-type': 'application/json' },
dataType: 'json', // not needed
body: JSON.stringify(credentials),
};
console.log(credentials);
return fetch('http://localhost/api/users', requestOptions) // first time
.then((response) => {
return response.json; // second time
})
.catch((err) => console.log(err.message));
},
}
Also use async/await. I'd do
actions: {
async register(credentials) {
const requestOptions = {
method: 'POST',
headers: { 'content-type': 'application/json' },
dataType: 'json',
body: JSON.stringify(credentials),
};
const res = await fetch('http://localhost/api/users', requestOptions);
}
return res.json();
}
And in the Register.vue
methods: {
register() {
this.$store.dispatch('register', {
firstname: this.firstname,
lastname: this.lastname,
email: this.email,
password: this.password,
}).then(data => {
console.log(data)
}).catch((err) => console.log(err.message));
});
},
};
Also you can put it in try/cache etc. It's up to you.
Check the docs, it well explained.

Related

Status failed error get after enter card input in network international ngenius payment in react native?

First we create sandbox account from https://www.network.ae/en/contents/listing/online-solutions#book-1
then we create access Token see code
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/vnd.ni-identity.v1+json");
myHeaders.append("Authorization", `Basic ${}API_KEY`);
myHeaders.append("Cookie", "\_abck=5C342393A623B53581D9AE558C857BF2\~-1\~YAAQfXYsMa+W3wWFAQAACGk7MwlNL93fTExvJYX4pRpd6PZpRFbRT0BgePfZ2tn15MkLCVst80XVExP/xPZkPh0LUZq4QO4k+KN0bm+Tz0NlX26lWmSlI6mq0kePXMH9MJt7yQy7Rx9ZIsR2Amcb44zP+hnySdCx2uq3vwgl4ZVMQ2soqosGNHQuESjb/JJAirysYwiyN7/Mw/qg5NzXzf2ncRTbB/3CcVp/yiZPOwAsxD8x+8oZA3VAxLgvbuv0Tn9ccNN9oPATqzDtoXD1LnQorof6S/S6btPx4BZTgFeqvmxX3q5SNSlsDgySTzI5qkp81wrjTm5ficp1U0k5fcimfaR0V8Xq21luPY9VdveWYd5B87UOIcalA2CQz2S7yFSo14uqKarLVFbh00Vd1Zw=\~-1\~-1\~-1; bm_sz=AF5FEAEE5BC3A58968E80BB8D640735E\~YAAQfXYsMbCW3wWFAQAACGk7MxLpffLMR5ZpUagjSJqRS4G5rjc8MolC2xNhZUaUKTKGMj5Fvi0eLn3cbULd/jtI4QO0h8Cl4c3bFROSPs9jpPu1UFDm9R1gGBB6T7rIFPU+sxiw2wQ7gGvrlik680yFDoUraO3MoRl8cfpOu73nyKryhpb1ebghFcrF2aYM9B4f3c8ER1Fk1VTXN5TGij9bLAT7BDjVOtLjQVG5AL/wKZ57t21EFnCqlnXioDXla8Jylj6T7EQzE/5yKno2Z9Z6jMTx1rU6Jcy5nUq6SG50aVYOUYwA/w1k6WSj\~3749186\~4343095");
var raw = "";
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://api-gateway.sandbox.ngenius-payments.com/identity/auth/access-token", requestOptions)
.then(response => response.json())
.then(result => {
setAccessToken(result.access_token)
})
.catch((e)=>console.log(e)
Then we create an order
var myHeaders = new Headers();
myHeaders.append("Authorization", `Bearer ${access_token}`);
myHeaders.append("Content-Type", "application/vnd.ni-payment.v2+json");
myHeaders.append("Accept", "application/vnd.ni-payment.v2+json");
myHeaders.append("Cookie", "_abck=5C342393A623B53581D9AE558C857BF2~-1~YAAQJfhWuMbikwmFAQAAm3R2KgkBO6swEeKoHNG6113OL/hvGd9LQQEo5ieCnty0rrZ7UcaRqt7InR2UUWFze7723wDPiy+SCmtMNKKL4zCJi7fwqJed1SMa2PWjCe5qWiFf/Fa0NtMY3a7TedM+6XI3cMMieW4GMHrQwGTz0BrFsZ3gC6jCUgYUTFO55uMpD3627GjbcZmsluCPLWKVLdGlsPX/wIknh1Tl/+YSO58Bnv97KpZnb0ZLZck2PYFnzGOPTiJ2JQe6vakvSFh68UxMIZYVxekwS2LTZjJGtZqLMt45A/lLbpxq95qzzCMWdxrwE0JgMgWfgu9l1k+Scq69UpgOo331AEJ+AASZF1MZ4CRJ7MEs1WpjlTbDroZVS0Uh~-1~-1~-1");
var raw = JSON.stringify({
"action": "PURCHASE",
"amount": {
"currencyCode": "AED",
"value": 2000
},
"emailAddress": "govindsingh#gmail.com",
"merchantOrderReference":"my-order",
"billingAddress":{
"firstName":"Govind",
"lastName":"Singh",
"address1":"abc",
"city":"Dubai",
"state":"Dubai",
"countryCode":"AED"
},
"merchantAttributes":{
"skipConfirmationPage":true,
"skip3DS":true
}
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch(`https://api-gateway.sandbox.ngenius-payments.com/transactions/outlets/${Outlet_id}/orders`, requestOptions)
.then(response => response.json())
.then(result => {
setOrder(result.access_token)
})
.catch((e)=>console.log(e)
then we call make card payment function by https://www.npmjs.com/package/#network-international/react-native-ngenius
const res = await initiateCardPayment(order);
console.log("res"+ res)
Alert.alert(
'Success',
'Payment was successful',
[{ text: 'OK', onPress: () => console.log('OK Pressed') }],
{ cancelable: false },
);
} catch (err) {
console.log(err);
alert(
'Error',
'Payment was not successful',
[{ text: 'OK', onPress: () => console.log('OK Pressed') }],
{ cancelable: false },
);
}
then we get an error -
[status:failed]
Thanks in Advance
Please give me any solution

How do i pass data to a function under data in vuejs

I tried to reference this.items in the function in taskList.cls.cls
the main idea is to run a task in vue-terminal then pass the result of the post request to this.items but it's returning undefined
data() {
return {
//this is the data i want to pass the post response to
items: [],
query: '',
taskList: {
// your tasks
cls: {
description: 'Clear Terminal',
cls: this, async(pushToList) {
const p = new Promise(resolve => {
this.query = 'SELECT * FROM notifications'
const token = localStorage.getItem('token')
axios.post('/query', {'query': this.query}, {
'headers': {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
}
}).then(res => {
//i want to reference
**this.items = res.data.data.result**
//
pushToList({type: 'system', label: 'Running query', message: 'Please wait!!'})
}).catch(err => {
console.log(err)
})
setTimeout(() => {
resolve({type: 'success', label: 'Success', message: 'Success!'})
this.test = "worked"
}, 2000)
})
return p
}
}
},
commandList: {
// your commands
}
}
},
Don't do that, call api on "mount()".

Vuex state array turning an proxy object when it is mutated

I develop a project which gets datas from database. I use Vuex for state management.
Vuex Store File
const store = createStore({
state: {
notUser: {
name: "",
email: '',
password: ''
},
user: {
name: '',
email: '',
messages: [],
about: '',
place: '',
age: '',
role: '',
blocked: false
},
problem: {
title: '',
content: ''
},
problems: [],
errorMessage: {
error: false,
message: '',
success: false
},
},
mutations: {
errorHandler(state, error) {
state.errorMessage.error = true
state.errorMessage.message = error.response.data.message
},
defineUser(state, req) {
state.user = req.data.user
console.log(state.user)
},
getProblems(state, problems) {
state.problems = problems
console.log(state.problems)
}
},
actions: {
register({ commit }, notUser) {
axios({
method: 'post',
url: 'http://localhost:3000/api/auth/register',
data: notUser,
withCredentials: true,
headers: {
"Accept": "application/json"
}
})
.then(res => {
this.state.errorMessage.success = true
console.log(res.data.data.user)
})
.catch(err => {
this.state.errorMessage.success = false
console.log(err.response)
commit('errorHandler', err)
})
},
userLogin({commit}, notUser) {
axios({
method: 'post',
url: 'http://localhost:3000/api/auth/login',
data: notUser,
withCredentials: true,
headers: {
"Accept": "application/json"
}
})
.then(res => {
this.state.user = res.data.data.user
this.state.errorMessage.success = true
console.log(this.state.user)
})
.catch(err => {
this.state.errorMessage.success = false
console.log(err.response)
commit('errorHandler', err)
})
},
checkUser({commit}, access_token) {
axios({
method: 'post',
url: 'http://localhost:3000/api/auth/VpW02cG0W2vGeGXs8DdLIq3dQ62qMd0',
data: access_token,
withCredentials: true,
headers: {
"Accept": "application/json"
}
})
.then(res => {
console.log(res)
commit('defineUser', res)
return true
})
.catch(err => {
console.log(err.response)
commit('errorHandler', err)
return false
})
},
sendProblem({commit}, problem) {
axios({
method: 'post',
url: 'http://localhost:3000/api/problem/add',
data: problem,
withCredentials: true,
headers: {
"Accept": "application/json"
}
})
.then(res => {
console.log(res)
return true
})
.catch(err => {
console.log(err.response)
commit('errorHandler', err)
return false
})
},
getAllProblems({commit}) {
axios({
method: 'get',
url: 'http://localhost:3000/api/problem/getall',
withCredentials: true,
headers: {
"Accept": "application/json"
}
})
.then(res => {
commit('getProblems', res.data.data)
return true
})
.catch(err => {
console.log(err.response)
commit('errorHandler', err)
return false
})
}
// registerUser({commit}, user) {
// commit('register', user)
// }
},
Vue Component: Where Vuex store is being used
computed: {
...mapState(["user", 'problems'])
},
mounted() {
return this.getAll()
},
methods: {
...mapActions(['getAllProblems']),
goToAdd() {
this.$router.push('/add')
},
async getAll() {
this.getAllProblems()
}
}
The problem is when I try to request with getAllProblems action, it should mutate problems variable with getProblems(). Actually it does. But after problems variable changes, it turns something a proxy object. Here are images:
Here is an image of proxy object:
The original data coming from database:
Thanks for comment of #Hasan Hasanova
Okay got it. I called api before website is mounted and used function to get variables from store. The other problem was happened because of using wrong syntax of v-for. Here is the code:
computed: {
allProblems() { // this is the problems array that i was trying to get
return this.$store.state.allProblems
},
loader() {
return this.allProblems == null ? true : false
}
},
beforeMount() {
this.$store.dispatch('getAllProblems', {root: true})
},
And here is the template code :
<div v-if="allProblems.length > 0" class="middle-side">
<div v-for="(problem) in allProblems" :key="problem.id" class="card">
<router-link :to="{ name: 'ProblemDetail', params: { id: problem._id, slug: problem.slug }}">
<div class="card-header">
<div class="card-header-title">
<div class="user-image">
<img src="../../assets/problem.png" />
</div>
<span class="user-name">{{ problem.user.name }}</span>
</div>
...
Thanks for all.
I have the same problem as yours, but I solved it first by converting it before the getter's return, converting it to JSON to string, and converting a string to JSON again before returning it.
const str = JSON.stringify(data)
return JSON.parse(str)
You want to use mapActions to call the action. Then get your data via state, instead of returning the function, since the action is calling a mutation via commit.
computed: {
// you have access to `problems` in the template. Use `v-if` before you `v-for` over the array of problems.
...mapState(["user", 'problems'])
},
mounted() {
this.getAllProblems();
},
methods: {
// ...mapActions(['getAllProblems']),
goToAdd() {
this.$router.push('/add')
}
}
For some reason that happens during the passing of res.data.data to mutations. So if you're expecting a single row result set you should do like:
POPULATE_THIS_STATE_VAR(state, data) {
state.thisStateVar = data[0]
}
... and if you're expecting an array of objects to the result set like what you have, you could do like:
POPULATE_THIS_STATE_VAR(state, data) {
if (data) {
for (let i = 0; i < data.length; i++) {
state.thisStateVar .push(data[i])
}
}
}

upload expo camera roll image to server

I'm using expo camera to take a picture. The output I get is a file in format file:///data/user/0/host.exp.exponent/..../Camera/1075d7ef-f88b-4252-ad64-e73238599e94.jpg
I send this file path to the following action and try to upload it to
export const uploadUserPhoto = (localUri,uid) => async dispatch => {
let formData = new FormData();
formData.append('avatar', { uri: localUri, fileName: uid});
let res = await fetch(`${API_URL}api/uploadPhoto`, {
method: 'POST',
body: formData,
header: {
'content-type': 'multipart/form-data',
},
});
Afterward, I get [Unhandled promise rejection: TypeError: Network request failed] and nothing arrives to server. I tried using some string to send in the body and the fetch worked, so I guess it has something to do with my formData configuration.
The formData is:
{
"_parts": Array [
Array [
"avatar",
Object {
"fileName": "6eAntcmoEsdBeSD2zfka9Nx9UHJ3",
"type": "jpg",
"uri": "file:///data/us....2e6e3e8d3223.jpg",
},
],
],
}
How I use postman to test my sails controller
Sails controller function:
uploadPhoto: function (req, res) {
req.file('avatar').upload({
adapter: require('skipper-s3'),
key: 'XXXX',
secret: 'XXX',
bucket: 'XXX',
saveAs: req.param('fileName') + '.png',
}, function (err, filesUploaded) {
....
});
});
}
Problem was that I didn't specify the filename.
Just did this and it worked!!! :)
data.append('filename', 'avatar');
data.append('fileName', uid);
data.append('avatar', {
uri: photo.uri,
name: 'selfie.jpg',
type: 'image/jpg'
});
const config = {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'multipart/form-data',
},
body: data
};
fetch(`${API_URL}api/uploadPhoto`, config).then(responseData => {
console.log(responseData);
}).catch(err => { console.log(err); });
just add these params in photo this worked for me
data.append('avatar', {
uri: photo.uri,
name: 'selfie.jpg',
type: 'image/jpg'
});

Vue firing requests one after another

I have two functions. I would like to fire a function - wait until firstFunction() has ended and then fire secondFunction(). But I don't want to do this as a callback.
firstFunction() {
this.$http.post(
`url1`,
data1,
{ channel: 'default' },
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
).then(response => {
console.log(response)
});
},
secondFunction() {
this.$http.post(
`url2`,
data2,
{ channel: 'default' },
{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
).then(response => {
console.log(response)
});
},
finalFunction() {
this.firstFunction()
this.secondFunction()
}