Custom response Express Validator as JSON - node.js

I'm using Express Validator for validate user req. I'm trying to create custom response like this:
{
"code": 300,
"status": false,
"message": "Your email is not valid",
"param": "email",
"value": "kevin"
}
but what I got is
[
{
"code": 300,
"status": false,
"message": "Your email is not valid",
"param": "email",
"value": "kevin"
}
]
Here is my code:
controller.js:
const errors = validationResult(req).formatWith(utils.error);
if(!errors.isEmpty()){
res.status(300).json(errors.array());
}
ResUtils.js
error({msg, param, value, nestedErrors}) {
var code = 300;
var format = {code, status:false, message:msg, param:param, value:value, nestedErrors:nestedErrors};
return format;
}
How do I can get the response as Json, without [].
Thankyou.

Well, this state is good in my opinion, there is possibility of multiple errors so you should process all messages in a frontend app (or mobile or whatever) to give user informations about all invalid fields (or options or whatever). If you really need only a object, you can pick a first error message from an array for example.
if(!errors.isEmpty()){
const errorsArray = errors.array();
res.status(300).json(errorsArray[0]);
}
But as I said it is better approach to handle all error messages.

Related

How to write notification using cron.schedule inside api request

I want to give write notification within an API request. I am able to write the notification, after that I am getting message saying "Notification" but, it's not showing in application
router.post('/api/v1/getAssetDetails', async(req, res)=>{ try { emitter.emit("saveNotification", "GENERAL", { "name": "Harshad", "description": "munna", "status": "Hello", "ephemeralTeamId": 1 }); let responseObject = setResponse(true, "Notification Sent Successfully", res.statusCode); res.status(200).send(responseObject); } catch (e) { console.log(e); res.status(500).send(setResponse(false, "Internal Server Error", res.statusCode)); } })
{ "status": true, "message": "Notification Sent Successfully", "code": 200, "data": null }
Getting in the local hit, but not in the application.

Telegram bot ChatInviteLink

I managed to use the createChatInviteLink function but I don't know how to extract the invitation link to send to the user.
function create_chat_link(chat_id){
chat_id = ‘chat_id';
max_usos = 1;
var url = telegramUrl + '/createChatInviteLink?chat_id=' + chat_id + '&member_limit=' + max_usos;
return UrlFetchApp.fetch(url);
}
How can I extract the link that is generated when using that method?
When using Telegram Bot API you will receive a json formatted response upon calling your url.
In your case for createChatInviteLink method this response will look something like this:
{
"ok": true,
"result": {
"invite_link": "https://t.me/+fLsUa7gOGDxjOOA2",
"creator": {
"id": 210111457,
"is_bot": true,
"first_name": "...",
"username": "..."
},
"creates_join_request": false,
"is_primary": false,
"is_revoked": false
}
}
Check invite_link field to find your invitation link.

What is the correct JSON format for googles classroom.create?

Im trying to create a classroom using googles classroom API. Whenever run the classroom.create function I always receive the same error message. I'm using the JSON format from their docs but I just can't get it to work. I think I must be missing something.
This is the function:
async function listCourses(auth) {
const classroom = google.classroom({ version: 'v1', auth });
//Read data from JSON
let data = fs.readFileSync("class.json");
let course = JSON.parse(data);
//Try and create course
try {
const res = await classroom.courses.create(course);
console.log(res.data);
}
catch (error) {
console.log(error)
}
//List all current courses
classroom.courses.list({
pageSize: 10,
}, (err, res) => {
if (err) return console.error('The API returned an error: ' + err);
const courses = res.data.courses;
if (courses && courses.length) {
console.log('Courses:');
courses.forEach((course) => {
console.log(`${course.name} (${course.id})`);
});
} else {
console.log('No courses found.');
}
});
}
This is the JSON:
{
"id": "157942918368",
"name": "English - 9Y",
"section": "Period 2",
"ownerId": "me",
"courseState": "ACTIVE"
}
This is the error message:
code: 400,
errors: [
{
message: `Invalid JSON payload received. Unknown name "name": Cannot bind query parameter. Field 'name' could not be found in request message.\n` +
`Invalid JSON payload received. Unknown name "ownerId": Cannot bind query parameter. Field 'ownerId' could not be found in request message.\n` +
`Invalid JSON payload received. Unknown name "courseState": Cannot bind query parameter. Field 'courseState' could not be found in request message.\n` +
`Invalid JSON payload received. Unknown name "id": Cannot bind query parameter. Field 'id' could not be found in request message.\n` +
`Invalid JSON payload received. Unknown name "section": Cannot bind query parameter. Field 'section' could not be found in request message.`,
reason: 'invalid'
}
]
I believe your goal as follows.
You want to create new course using googleapis for Node.js.
Modification points:
At googleapis for Node.js, please put the request body to resource and/or requestBody.
I think that the reason of your error message is due to this.
When "id": "157942918368", is used, an error of Request contains an invalid argument. occurs.
When "courseState": "ACTIVE" is used, an error of "#CourseStateDenied This user cannot create or transition courses into the requested state." occurs.
"PROVISIONED" can be used in this case.
When above points are reflected to your script, it becomes as follows.
Modified script:
From:
const res = await classroom.courses.create(course);
To:
const res = await classroom.courses.create({ requestBody: course });
or
const res = await classroom.courses.create({ resource: course });
And also, please modify your request body as follows.
From:
{
"id": "157942918368",
"name": "English - 9Y",
"section": "Period 2",
"ownerId": "me",
"courseState": "ACTIVE"
}
To:
{
"name": "English - 9Y",
"section": "Period 2",
"ownerId": "me",
}
Note:
In this modification, it supposes that your const classroom = google.classroom({ version: 'v1', auth }); can be used for using the method of courses.create in Classroom API.
References:
Method: courses.create
googleapis for Node.js

The id provided does not exist razorpay in nodejs

i'm implementing razorpay payment gateway in my React.js app with backend nodejs.
here frontend.jsx
razorpayHandler = () =>{
const payment_amount = this.props.TotalPrice;
const backend_url = 'https://25234399bb.ngrok.io';
const self = this;
const options = {
key: config.RAZOR_PAY_KEY,
amount: payment_amount * 100,
name: 'StanPlus',
description: 'pay your ambulance fare',
handler(response) {
const paymentId = response.razorpay_payment_id;
const url = backend_url+'/razorpay/'+paymentId+'/'+payment_amount+'/'+self.id;
console.log(paymentId)
// Using my server endpoints to capture the payment
fetch(url, {
method: 'get',
headers: {
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8"
}
})
.then(resp => resp.json())
.then(function (data) {
console.log(data)
})
.catch(function (error) {
console.log('Request failed', error);
});
},
theme: {
color: '#40A9FF',
},
};
const rzp1 = new window.Razorpay(options);
rzp1.open();
}
backend.js(nodejs)
var express = require('express');
var router = express.Router();
var config = require('../config');
const Razorpay = require('razorpay');
const instance = new Razorpay({
key_id: config.razorpay_live_key,
key_secret: config.razorpay_live_secret,
});
router.get('/:payment_id/:amount/:BID',function(req,res,next){
const {payment_id } = req.params;
const {BID} = req.params;
const amount = Number(req.params.amount*100);
instance.payments.capture(payment_id, amount).then((data) => {
data.Bid = BID;
res.json(data);
}).catch((error) => {
res.json(error);
});
})
module.exports = router;
it showing me error
"statusCode":400,"error":{"code":"BAD_REQUEST_ERROR","description":"The id provided does not exist"
but if the same code if do process using test key its getting successfully completed but it is not working with live api.
here i'm passing an extra parameter to the backend which required for us but if removed that parameter then also it is not working.but with parameter it is working with test api.
when we send request to backend it is generating id and sending to backend also but still it showing The id provided does not exist.
if you are using test mode then just remove order_id parameter from json object.
I also faced this error a week ago. This error arrived when we changed the test keys to the production keys for final payment to work.
So I faced this issue The id provided does not exist because of the mismatch of Razorpay Keys on the frontend and backend side(node.js side.)
So make sure you have the same client key and secret of the production environment on both backend and frontend side.
Let me know in comments if it still is not resolved.
For Test Remove the OrderId from your options json data.
For Live mode Pass the autogenerated Orderid From the user Control.
Removing order_id is not good practice we should follow documentation.
To get order_id in React you have to first create a order in your backend eg(node.js). follow this steps to get order_id from Razorpay.
Step - 1
var instance = new Razorpay({ key_id: 'YOUR_KEY_ID', key_secret: 'YOUR_KEY_SECRET'})
this will initiate new Razorpay object.
Step - 2
MyOrder = instance.orders.create({amount, currency, receipt, notes})
this will create an order for you and then you have access to order_id. You can log MyOrder to see more available attributes or just console.log(MyOrder.id) to get order_id
and finally you have to pass your order_id in your case you have to pass order_id in options.
Note : You can access order id like this MyOrder.id
for more information check official doc.
you can find Razorpay SDKs for various Platform here
If you are using for payments, than remove order_id from options JSON value.
var options = {
"key": "xxxxxxxxxxxxxxx", // Enter the Key ID generated from the Dashboard
"amount": "50000", // Amount is in currency subunits. Default currency is INR. Hence, 50000 refers to 50000 paise
"currency": "INR",
"name": "Acme Corp",
"description": "Test Transaction",
"image": "https://example.com/your_logo",
// "order_id": "order_9A33XWu170gUtm", //This is a sample Order ID. Pass the `id` obtained in the response of Step 1
"handler": function (response){
alert(response.razorpay_payment_id);
alert(response.razorpay_order_id);
alert(response.razorpay_signature)
},
"prefill": {
"name": "Gaurav Kumar",
"email": "gaurav.kumar#example.com",
"contact": "9999999999"
},
"notes": {
"address": "Razorpay Corporate Office"
},
"theme": {
"color": "#3399cc"
}
};
This error happens when you pass an incorrect order_id to trigger the payment modal. Basically an order_id that does not belong to your razorpay account, or an invalid one.
Example: if you generated an order_id with one set of credentials and use another set of credentials afterwards, this issue can happen.
I too faced the same problem while integrating Razorpay for subscription payments
Initially, I passed order_id in the options param, which yielded the error -
{
"code": "BAD_REQUEST_ERROR",
"description": "The id provided does not exist",
"source": "business",
"step": "payment_initiation",
"reason": "input_validation_failed",
"metadata": {}
}
Hence replaced order_id with subscription_id.
Works now!
Check for the rp_type,
for subscription pass options["subscription_id"],
for orders pass options["order_id"]

400 BadRequest: Missing Credential feathersjs authentication-local

I'm trying to authenticate a user using #feathersjs/authentication-local, Though I'm giving proper username & password, I get following response
{
"name": "BadRequest",
"message": "Missing credentials",
"code": 400,
"className": "bad-request",
"data": {
"message": "Missing credentials"
},
"errors": {}
}
DB property of user entity is username & password. My configuration is as following
const settings = {
secret: 'super&secret',
usernameField: 'username',
passwordField: 'password',
entityUsernameField: 'username',
entityPasswordField: 'password'
};
app.configure(authentication(settings))
.configure(local());
app.service('authentication').hooks({
before: {
create: [authentication.hooks.authenticate(['local', 'jwt'])],
remove: [],
}
});
I've added "strategy": "local" on request body. What am I missing? Please help.
This usually happens when there is no Express bodyParser middleware registered. As shown in the feathers-chat it has to be set up before authentication.
Missing Credential feathersjs authentication-local, this error may occur due to following reasons:
You are missing fields when sending the request. Usually, if there is any data present it throws an error as NotAuthenticated: Invalid login if the credentials are not correct.
Escape fields in default.json to avoid referring to system environmental variables. Refer to this.

Resources