Nodejs- Trying to retrieve API request details using nodejs script - node.js

I am trying to fetch nodejs API request details like request header, response details, response time etc using nodejs script
request
.post('http://localhost:3000/api/pet')
.send({ name: 'Manny', species: 'cat' })
.set('X-API-Key', 'foobar')
.set('Accept', 'application/json')
.end(function(err, res){
// Calling the end function will send the request
});
I have tried with the packages like node-monitor- https://github.com/shunanya/Node.js-monitoring but it returns request details of all requests and need to pass server details and options
I was trying to use native node js functions and modules to get request and response details of API request for any request made using express, hapi, request, http
Basically I am trying to trigger one notification script when any http API request occurs from node application

Related

nodejs supertest express test prior to invoking external API

Not sure if this is possible but Id like to run a test without invoking an external API POST request.
Whats currently happening is ive got a test confirming the post data sent to my server API is processed correctly, as it needs to add some basic additional information to the BODY before sending it to the external API, and then the server makes another POST request to an external API with this modified BODY.
This is all done in the below function.
createUser(req,res){
...
// schema validation,
// adding fields
// external server post request
}
Is it possible to have my test ignore the external API call?
the test looks like
it('POST users --> 200 Successful Post', () => {
return request(app).post('/api/users').send(........ my json .......)
.expect('Content-Type', /json/)
.expect(200)
.then((response) => {
expect(response.body).toEqual(
......
)
})
});
You can use nock to intercept and mock requests for testings.
On your test, you can setup your mocking object like this:
const nock = require("nock");
const scope = nock("https://api.github.com")
.get("/repos/atom/atom/license")
.reply(200);
It will intercept an HTTPS GET requests to /repos/atom/atom/license.
How to Test Node.js Apps That Interact With External APIs

NodeJs Express how to handle items(params) that sent from frontend?

Im new in backend development (using NodeJs Express).
Its very basic question (I didn't find any good tutorial about it)
Question is:
I have this line of code:
app.get('/test', function (req ,res){
res.send('test');
});
What I wanna do is: BackEnd only sends res to FrontEnd, if FrontEnd send some JSON first.
Like Backend will show Something to FrontEnd, only if FrontEnd send JSON first;
How to handle it? What code to write?
Or what to type in google search to find this kind of tutorial
You are building a REST API with node. In REST we don't keep states. When we receive a request we process and respond. In the Front end, you can do wait until the response is received. use promises, async-await or callbacks to wait until the response in the Front end. Use these methods to connect with back end from front-end axios, fetch. To process the incoming JSON body use body-parser. Based on the request body you can process and send the response. PS: Every request should be given a response. That's how REST behaves.
In Query
yourbackend.com/test?message=welcomeToStackOverflow
This is how you can access with in query:
const {message} = req.query;
console.log(message);
// welcomeToStackOverflow
In Params
yourbackend.com/test/:message
This is how you can access with in params :
const {message} = req.params;
console.log(message);
// welcomeToStackOverflow
Here you have working example : https://codesandbox.io/s/trusting-rosalind-37brf?file=/routes/test.js

How can i make a node HTTP request that sends both file and data to a url?

I need to make a HTTP request to an api with Node, but the api requires me to send both auth parameters and a file in the Request body. I tried using the node request, but the file wasn't sent.
let req= require('request').post({
uri:"http://theAPIURL",
headers:{'content-type': 'application/json'},
form:{'username':'username','client_id':'client_id','user_pass':'user_pass#',
'fisier':fs.createReadStream('../home/modules/file.csv')
},
}

How to fetch a data from an API in MERN stack web application project?

I am building a library management system using MERN Stack, where the ISBN number is fetched from free Google Book API. But I am confused about how to fetch an API to my application.
You can use fetch API implemented by browsers or AJAX for using with ReactJS (or any frontend code for that matter)
With nodejs you can use pacakages like request, request-promise, node-fetch, axios in similar fashion.
An example using request library available for nodejs
request
.get('http://google.com/img.png' // api url)
.on('response', function(response) {
console.log(response.statusCode) // 200
console.log(response.headers['content-type']) // 'image/png'
// save the image somewhere, or render to webpage
})
.pipe(request.put('http://yoursite.com/img.png'))

Send Headers from NodeJS to Angular

I have a Node server running a single-page Angular web app. The requests to my server come in from a reverse proxy that attaches a set of headers for authentication. On certain events, the Angular app sends requests to another server, and those requests need to have the same authentication headerset that the Node server received from the reverse proxy. Is there a mechanism by which I can send the headers from Node to the client-side Javascript so that I can then pass them through in the requests made by my Angular web app?
You can use ExpressJS for NodeJs. There's a headers object present into request and response objects you can read/write. You can send it to client through a parameter (maybe) It depends what your client receive.
Example in coffee
# JSON response width previously req.headers
app.get /hello, (req, res) ->
res.json { status: 'OK', data: { headers: req.headers }
# Or you can use setHeader to set a special param in header
app.get /hello, (req, res) ->
res.setHeaders "foo", "bar"
res.json { status: 'OK' }
Hope this helps!

Resources