Oauth access_token with node.js and jawbone-up NPM - node.js

UPDATED: following feedback from Remus below.
I can successfully authorize my web application and get back an access_token and refresh_token. I'm using the nice Grant NPM (or is that really grant-express?) to get authenticated (thanks to author Simeon Valichkov).
How do I pass in the access_token to my Jawbone API calls as a bearer token using NPMs like jawbone-up or Purest?
Question#1 - What's the simplest way to create this API call with a express-bearer-token and actually get back my Jawbone json data?
What I'm seeing on the page is the token (a looong string) rather than the Jawbone json results data.
var express = require('express')
, session = require('express-session')
, ejs = require('ejs')
, app = express()
, fs = require('fs')
, https = require('https')
, Grant = require('grant-express')
, grant = new Grant(require('./config'))
, bodyParser = require('body-parser')
, Purest = require('purest')
, jawbone = new Purest({provider: 'jawbone'})
, morgan = require('morgan')
, bearerToken = require('express-bearer-token');
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({extended:true}))
app.use(session({secret:'grant'}))
app.use(grant)
app.use(morgan('combined'))
app.use(bearerToken());
app.use(function (req, res) {
res.send('Token '+req.token);
});
var $today = new Date()
var $start = new Date($today); $start.setDate($today.getDate() -7)
var $end = new Date($today)
var $startDate = Math.floor(($start).getTime()/1000)
var $endDate = Math.floor(($end).getTime()/1000)
app.get('/sleeps', function (req, res) {
//res.send(JSON.stringify(req.query.raw, null, 2))
jawbone.query()
.select('sleeps')
.where ({start_date:$startDate, end_date:$endDate})
.auth(req.token)
.request(function(err, res, body) {
// expecting (hoping) to get sleep json here ...??
var result = JSON.parse(body);
res.json(result.data.items)
})
});
// HTTPS
var sslOptions = {
key : fs.readFileSync('./.server.key'),
cert : fs.readFileSync('./.server.crt')
};
var secureServer = https.createServer(sslOptions, app).listen(5000, function(){
console.log('Listening on 5000');
});
My Grant config file looks like this and would seem to be the obvious place to store my tokens.
module.exports = {
"server": {
"protocol" : "https",
"host" : "localhost:5000"
},
'jawbone' : {
'key' : '6f**********',
'secret' : '9b918*********************',
'callback' : '/sleeps',
'scope' : ['basic_read','extended_read','move_read','sleep_read']
}
};

Just to clarify - you're asking how to grab the token a user used when making a request to your server?
Personally I've done it several ways, notably using a regular expression to grab Authorization: Bearer <token> out of the headers. But in the end, I've found my go-to solution when using Express is to use the express-bearer-token middleware:
express = require('express');
bearerToken = require('express-bearer-token');
app = express();
app.use(bearerToken());
app.use(function (req, res) {
res.send('Token '+req.token);
});
So in your case, it would be as simple as:
app.get('/sleeps', function(req, res) {
jawbone.query()
.select('sleeps')
.where ({start_date:'', end_date:''})
.auth(req.token)
.request(function(err, res, body) {
res.json(req.query.raw);
})
});

Related

Can't find the data that's sended by using Ajax in the request object (Nodejs)

I send a data object as in the code;
var xhttp = new XMLHttpRequest();
var dataset;
function data () {
dataset = {
"name" : document.getElementsByName("name")[0].value,
"pass" : document.getElementsByName("pass")[0].value,
"email" : document.getElementsByName("email")[0].value,
"birthday" : document.getElementsByName("birthday")[0].value,
"agree" : false
}
if(document.getElementById("signupcheck").className.search("active") > -1) dataset.agree = true
xhttp.open("POST", "/example", true);
xhttp.send(dataset);
}
And I try to get that data on NodeJs as in the code;
var express = require("express");
var app = express();
var router = express.Router();
app.use(express.static('public'));
app.get("/",function(req,res){
res.sendFile(__dirname + "/index.html");
console.log(__dirname);
})
app.post("/example", function(req,res) {
console.log(req.body)
})
var server = app.listen(8000,function(){
})
Ajax is working because I can see the req object on the console when I initialize the function. But the req object is so huge that doesn't fit into the terminal.
I can't find the data I send. How can I get the data?
So I think the issue is with your request.
After running it locally I get:
TypeError [ERR_INVALID_ARG_TYPE]: The "string" argument must be of type string or an instance of Buffer or ArrayBuffer. Received an instance of Object
After taking a look at the documentation it confirms this https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/send
Could you try this?
xhttp.send(JSON.stringify({dataset: dataset}))
or you could update your dataset object to
const dataset = {
dataset: {
name: document.getElementsByName('name')[0].value,
pass: document.getElementsByName('pass')[0].value,
email: document.getElementsByName('email')[0].value,
birthday: document.getElementsByName('birthday')[0].value,
agree: false,
},
}
and keep
xhttp.send(dataset)
Add the express json middleware so that you can access the body.
const express = require('express')
const app = express()
const router = express.Router()
app.use(express.json())
console.log(req.body.dataset)

NPM Grant OAuth Middleware "invalid_redirect" error

I have been trying to use this elegant looking package to authenticate with Jawbone API. But I keep getting this error -
I have configured my "app" with the Jawbone API service to use these Redirect URIs -
My config file looks like this -
module.exports = {
'server': {
'protocol' : 'https',
'host' : 'localhost',
'port' : 5000,
'callback' : '/done',
'transport' : 'session',
'state' : true
},
'jawbone' : {
'key' : '6f*********',
'secret' : '9b************************',
'callback' : '/connect/jawbone/callback',
'scope' : ['basic_read', 'sleep_read'],
}
}
I've tried to follow the authors examples to produce an app.js like this -
var config = require('./config');
var express = require('express');
var session = require('express-session');
var Grant = require('grant-express');
var grant = new Grant(require('./config.js'));
var bodyParser = require('body-parser')
var app = express()
var Purest = require('purest');
var jawbone = new Purest({provider:'jawbone'});
var https = require('https');
var fs = require('fs');
var logger = require('morgan')
app.use(logger('dev'))
app.use(bodyParser.urlencoded({extended:true}));
app.use(session({secret:'grant'}));
app.use(grant);
app.get('/done', function (req, res) {
console.log(req.query);
res.end(JSON.stringify(req.query, null, 2));
});
/*
jawbone.get('users/#me', {
auth:{bearer:'[ACCESS_TOKEN]'}
}, function (err, res, body) {
// body is a parsed JSON object containing the response data
console.log(body);
})
*/
var sslOptions = {
key: fs.readFileSync('./.server.key'),
cert: fs.readFileSync('./.server.crt')
};
var secureServer = https.createServer(sslOptions, app).listen(config.server.port, function(){
console.log('Listening on port ' + config.server.port);
});
I assume I'm making a noob-error and probably misreading the documentation or examples. Can someone point out what I have misconfigured?
As noted in the comments above your configuration should look like this:
{
'server': {
'protocol' : 'https',
'host' : 'localhost:5000',
'transport' : 'session',
'state' : true
},
'jawbone' : {
'key' : '6f*********',
'secret' : '9b************************',
'callback' : '/handle_jawbone_callback',
'scope' : ['basic_read', 'sleep_read'],
}
}
Currently there is no separate port option, so in case you don't have some sort of virtual host on top of your app, you should append the port number to the host value - host:'localhost:5000.
For callback key you should always set the path on your server where you want to receive the results from the OAuth flow. The /connect/jawbone/callback route that you specify for redirect_uri of your OAuth application is reserved for Grant, so you can't use that route directly.
For example you can set the final route like this: callback:'/handle_jawbone_callback'.
All of this is documented in the module's readme file as well.

How to access the raw body of the request before bodyparser?

I am writing a custom middleware that generates a cryptographic signature of every request (it is very similiar to the authentication mechanism used by AWS API v4). In order for this signature to be correctly generated, I must fetch the entire raw body of the HTTP request.
I am also using BodyParser, which is registered after my custom middleware.
My custom middleware can be represented like this:
// libs/simplifiedSignatureCheckerMiddleware.js
module.exports = function (req, res, next){
// simple and fast hashing stuff
var payload = '';
req.on('data', function(chunk) { payload += chunk }, null);
req.on('end', function(){
// hmac stuff
console.log(payload);
var ok = true; // ...
if(ok)
next();
else
next("Bad")
});
}
This is how I use it on the server.
// simpleServer.js
// BASE SETUP
// =============================================================================
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var jsonStream = require('express-jsonstream');
var nconf = require('nconf');
var https = require('https');
var fs = require('fs');
// load configurations
nconf.argv().env();
nconf.file({file: 'config.json'});
app.use(require('./libs/simplifiedSignatureCheckerMiddleware'));
// configure app to use bodyParser()
// this will let us get the data from a POST
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(jsonStream());
// ROUTES FOR API
// =============================================================================
var router = express.Router();
router.post('/api/', function (req, res) {
var param1 = req.body.param1 || "";
var param2 = req.body.param2 || "";
res.json({message: 'welcome', one: param1, two: param2 });
});
// REGISTER ROUTES
app.use(router);
// START THE SERVER
// =============================================================================
https.createServer({
key: fs.readFileSync('./key.pem'),
cert: fs.readFileSync('./cert.pem')
}, app).listen(nconf.get('http:port'));
console.log("APIs listening on port " + nconf.get('http:port'));
As you can verify, the raw body is written successfully to the console by the middleware, BUT the request will never be processed by the registered route and the connection hangs forever.
Do you have any clue on how to solve this problem?
Thanks in advance.
Ok, since the only feasible way to solve this problem seems to be by modifying the original source code of bodyParser, I have forked it.
https://github.com/emanuelecasadio/body-parser-rawbody
This fork exposes the raw body of the request as a field named rawBody. As you can see, there is only ONE extra line of code.
You can install it by using npm install body-parser-rawbody.
EDIT
Another option is to use the bodyParser like this, as noted by dougwilson here: https://github.com/expressjs/body-parser/issues/83#issuecomment-80784100
app.use(bodyParser.json({verify:function(req,res,buf){req.rawBody=buf}}))
I haven't personally tried this option and I do not know if it works.

Why is socket.io creating a second 'sid' cookie with a different path?

I'm pulling up a project for which I swear this was not a problem before, but apparently is not right now -- I'm probably doing something stupid. I'm seeing express & socket.io create two different "sid" cookies, one with a path of "/" and the other with a path of "/socket.io". The behavior I'm expecting is to share the same cookie/session between my express app & socket.io.
"sid" cookie for "/":
"sid" cookie for "/socket.io":
I'm setting up express via:
var config = require('config');
var express = require('express');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var sessionStore = require('./session-store');
var sessionConfig = {
store : sessionStore,
secret : config.server.sessionSecret,
key : config.server.sessionKey,
saveUninitialized : true,
resave : true,
cookie : { secure: config.server.useHTTPS }
};
module.exports = function (app) {
app.use(cookieParser(config.server.sessionSecret));
app.use(session(sessionConfig));
};
I'm setting up socket.io via:
var config = require('config');
var redis = require('socket.io-redis')(config.redis.socket);
var cookieParser = require('socket.io-cookie-parser');
var sessionStore = require('./session-store');
module.exports = function (io) {
io.adapter(redis);
io.use(cookieParser(config.server.sessionSecret));
io.use(authorization);
};
function authorization (socket, next) {
var unauthorized = new Error('Unauthorized');
if (!socket.request.headers.cookie) {
return next(unauthorized);
}
var sessionKey = socket.server.engine.cookie;
var sessionId = socket.request.signedCookies[sessionKey] || socket.request.cookies[sessionKey];
if (!sessionId) {
return next(unauthorized);
}
sessionStore.get(sessionId, function (err, session) {
// use session's userId to fetch user & attach to socket
});
}
These two files are tied together from my main server file:
var http = require('http');
var express = require('express');
var socketio = require('socket.io');
var config = require('config');
var app = express();
var server = http.Server(app);
var io = socketio(server, {
cookie: config.server.sessionKey
});
// initialize aspects of the app
require('./config/initializers/io')(io);
require('./config/initializers/express')(app);
module.exports = server;
Okay, I think I solved it. It looks like supplying the cookie option when mounting socket.io atop my server ends up causing engine.io to set a cookie with the same name based upon these lines of code:
if (false !== this.cookie) {
transport.on('headers', function(headers){
headers['Set-Cookie'] = self.cookie + '=' + id;
});
}
According to RFC-2109 HTTP State Management Mechanism, the default path is the current URL path:
Path Defaults to the path of the request URL that generated the
Set-Cookie response, up to, but not including, the
right-most /.
That would explain the new cookie being created since socket.io's endpoint is /socket.io by default. Since I'm using custom authorization that reads a cookie anyway, I figure it's safe to disable cookies in engine.io by changing my socket instantiation to the following:
var io = socketio(server, {
cookie: false
});
This now breaks my authorization function included in the original question, specifically this line:
var sessionKey = socket.server.engine.cookie;
Since I'm no longer passing the cookie key through to socket.io/engine.io, I instead need to read straight from my config:
var sessionKey = config.server.sessionKey;

How to get GET (query string) variables in Express.js on Node.js?

Can we get the variables in the query string in Node.js just like we get them in $_GET in PHP?
I know that in Node.js we can get the URL in the request. Is there a method to get the query string parameters?
Since you've mentioned Express.js in your tags, here is an Express-specific answer: use req.query. E.g.
var express = require('express');
var app = express();
app.get('/', function(req, res){
res.send('id: ' + req.query.id);
});
app.listen(3000);
In Express it's already done for you and you can simply use req.query for that:
var id = req.query.id; // $_GET["id"]
Otherwise, in NodeJS, you can access req.url and the builtin url module to url.parse it manually:
var url = require('url');
var url_parts = url.parse(request.url, true);
var query = url_parts.query;
In Express, use req.query.
req.params only gets the route parameters, not the query string parameters. See the express or sails documentation:
(req.params) Checks route params, ex: /user/:id
(req.query) Checks query string params, ex: ?id=12 Checks urlencoded body params
(req.body), ex: id=12 To utilize urlencoded request bodies, req.body should be an object. This can be done by using the _express.bodyParser middleware.
That said, most of the time, you want to get the value of a parameter irrespective of its source. In that case, use req.param('foo'). Note that this has been deprecated as of Express 4: http://expressjs.com/en/4x/api.html#req.param
The value of the parameter will be returned whether the variable was in the route parameters, query string, or the encoded request body.
Side note- if you're aiming to get the intersection of all three types of request parameters (similar to PHP's $_REQUEST), you just need to merge the parameters together-- here's how I set it up in Sails. Keep in mind that the path/route parameters object (req.params) has array properties, so order matters (although this may change in Express 4)
For Express.js you want to do req.params:
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
I learned from the other answers and decided to use this code throughout my site:
var query = require('url').parse(req.url,true).query;
Then you can just call
var id = query.id;
var option = query.option;
where the URL for get should be
/path/filename?id=123&option=456
//get query&params in express
//etc. example.com/user/000000?sex=female
app.get('/user/:id', function(req, res) {
const query = req.query;// query = {sex:"female"}
const params = req.params; //params = {id:"000000"}
})
If you are using ES6 and Express, try this destructuring approach:
const {id, since, fields, anotherField} = request.query;
In context:
const express = require('express');
const app = express();
app.get('/', function(req, res){
const {id, since, fields, anotherField} = req.query;
});
app.listen(3000);
You can use default values with destructuring too:
// sample request for testing
const req = {
query: {
id: '123',
fields: ['a', 'b', 'c']
}
}
const {
id,
since = new Date().toString(),
fields = ['x'],
anotherField = 'default'
} = req.query;
console.log(id, since, fields, anotherField)
There are 2 ways to pass parameters via GET method
Method 1 :
The MVC approach where you pass the parameters like /routename/:paramname
In this case you can use req.params.paramname to get the parameter value For Example refer below code where I am expecting Id as a param
link could be like : http://myhost.com/items/23
var express = require('express');
var app = express();
app.get("items/:id", function(req, res) {
var id = req.params.id;
//further operations to perform
});
app.listen(3000);
Method 2 :
General Approach : Passing variables as query string using '?' operator
For Example refer below code where I am expecting Id as a query parameter
link could be like : http://myhost.com/items?id=23
var express = require('express');
var app = express();
app.get("/items", function(req, res) {
var id = req.query.id;
//further operations to perform
});
app.listen(3000);
You should be able to do something like this:
var http = require('http');
var url = require('url');
http.createServer(function(req,res){
var url_parts = url.parse(req.url, true);
var query = url_parts.query;
console.log(query); //{Object}
res.end("End")
})
UPDATE 4 May 2014
Old answer preserved here: https://gist.github.com/stefek99/b10ed037d2a4a323d638
1) Install express: npm install express
app.js
var express = require('express');
var app = express();
app.get('/endpoint', function(request, response) {
var id = request.query.id;
response.end("I have received the ID: " + id);
});
app.listen(3000);
console.log("node express app started at http://localhost:3000");
2) Run the app: node app.js
3) Visit in the browser: http://localhost:3000/endpoint?id=something
I have received the ID: something
(many things have changed since my answer and I believe it is worth keeping things up to date)
Express specific simple ways to fetch
query strings(after ?) such as https://...?user=abc&id=123
var express = require('express');
var app = express();
app.get('/', function(req, res){
res.send('id: ' + req.query.id);
});
app.listen(3000);
query params such as https://.../get/users/:id
var express = require('express');
var app = express();
app.get('/get/users/:id', function(req, res){
res.send('id: ' + req.params.id);
});
app.listen(3000);
A small Node.js HTTP server listening on port 9080, parsing GET or POST data and sending it back to the client as part of the response is:
var sys = require('sys'),
url = require('url'),
http = require('http'),
qs = require('querystring');
var server = http.createServer(
function (request, response) {
if (request.method == 'POST') {
var body = '';
request.on('data', function (data) {
body += data;
});
request.on('end',function() {
var POST = qs.parse(body);
//console.log(POST);
response.writeHead( 200 );
response.write( JSON.stringify( POST ) );
response.end();
});
}
else if(request.method == 'GET') {
var url_parts = url.parse(request.url,true);
//console.log(url_parts.query);
response.writeHead( 200 );
response.write( JSON.stringify( url_parts.query ) );
response.end();
}
}
);
server.listen(9080);
Save it as parse.js, and run it on the console by entering "node parse.js".
Whitequark responded nicely. But with the current versions of Node.js and Express.js it requires one more line. Make sure to add the 'require http' (second line). I've posted a fuller example here that shows how this call can work. Once running, type http://localhost:8080/?name=abel&fruit=apple in your browser, and you will get a cool response based on the code.
var express = require('express');
var http = require('http');
var app = express();
app.configure(function(){
app.set('port', 8080);
});
app.get('/', function(req, res){
res.writeHead(200, {'content-type': 'text/plain'});
res.write('name: ' + req.query.name + '\n');
res.write('fruit: ' + req.query.fruit + '\n');
res.write('query: ' + req.query + '\n');
queryStuff = JSON.stringify(req.query);
res.end('That\'s all folks' + '\n' + queryStuff);
});
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
})
It is so simple:
Example URL:
http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK
You can print all the values of query string by using:
console.log("All query strings: " + JSON.stringify(req.query));
Output
All query strings : { "id":"3","activatekey":"$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjz
fUrqLrgS3zXJVfVRK"}
To print specific:
console.log("activatekey: " + req.query.activatekey);
Output
activatekey: $2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK
You can use
request.query.<varible-name>;
You can use with express ^4.15.4:
var express = require('express'),
router = express.Router();
router.get('/', function (req, res, next) {
console.log(req.query);
});
Hope this helps.
In express.js you can get it pretty easy, all you need to do in your controller function is:
app.get('/', (req, res, next) => {
const {id} = req.query;
// rest of your code here...
})
And that's all, assuming you are using es6 syntax.
PD. {id} stands for Object destructuring, a new es6 feature.
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
You can use this or you can try body-parser for parsing special element from the request parameters.
consider this url -> /api/endpoint/:id?name=sahil
here id is param where as name is query. You can get this value in nodejs like this
app.get('/api/endpoint/:id', (req, res) => {
const name = req.query.name; // query
const id = req.params.id //params
});
There are many answers here regarding accessing the query using request.query however, none have mentioned its type quirk. The query string type can be either a string or an array, and this type is controlled by the user.
For instance using the following code:
const express = require("express");
const app = express();
app.get("/", function (req, res) {
res.send(`Your name is ${(req.query.name || "").length} characters long`);
});
app.listen(3000);
Requesting /?name=bob will return Your name is 3 characters long but requesting /?name=bob&name=jane will return Your name is 2 characters long because the parameter is now an array ['bob', 'jane'].
Express offers 2 query parsers: simple and extended, both will give you either a string or an array. Rather than checking a method for possible side effects or validating types, I personally think you should override the parser to have a consistent type: all arrays or all strings.
const express = require("express");
const app = express();
const querystring = require("querystring");
// if asArray=false only the first item with the same name will be returned
// if asArray=true all items will be returned as an array (even if they are a single item)
const asArray = false;
app.set("query parser", (qs) => {
const parsed = querystring.parse(qs);
return Object.entries(parsed).reduce((previous, [key, value]) => {
const isArray = Array.isArray(value);
if (!asArray && isArray) {
value = value[0];
} else if (asArray && !isArray) {
value = [value];
}
previous[key] = value;
return previous;
}, {});
});
app.get("/", function (req, res) {
res.send(`Your name is ${(req.query.name || "").length} characters long`);
});
app.listen(3000);
So, there are two ways in which this "id" can be received:
1) using params: the code params will look something like :
Say we have an array,
const courses = [{
id: 1,
name: 'Mathematics'
},
{
id: 2,
name: 'History'
}
];
Then for params we can do something like:
app.get('/api/posts/:id',(req,res)=>{
const course = courses.find(o=>o.id == (req.params.id))
res.send(course);
});
2) Another method is to use query parameters.
so the url will look something like ".....\api\xyz?id=1" where "?id=1" is the query part. In this case we can do something like:
app.get('/api/posts',(req,res)=>{
const course = courses.find(o=>o.id == (req.query.id))
res.send(course);
});
In case you want to avoid express, use this example:
var http = require('http');
const url = require('url');
function func111(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
var q = url.parse(req.url, true);
res.end("9999999>>> " + q.query['user_name']);
}
http.createServer(func111).listen(3000);
usage:
curl http://localhost:3000?user_name=user1
by yl
you can use url module to collect parameters by using url.parse
var url = require('url');
var url_data = url.parse(request.url, true);
var query = url_data.query;
In expressjs it's done by,
var id = req.query.id;
Eg:
var express = require('express');
var app = express();
app.get('/login', function (req, res, next) {
console.log(req.query);
console.log(req.query.id); //Give parameter id
});
If you ever need to send GET request to an IP as well as a Domain (Other answers did not mention you can specify a port variable), you can make use of this function:
function getCode(host, port, path, queryString) {
console.log("(" + host + ":" + port + path + ")" + "Running httpHelper.getCode()")
// Construct url and query string
const requestUrl = url.parse(url.format({
protocol: 'http',
hostname: host,
pathname: path,
port: port,
query: queryString
}));
console.log("(" + host + path + ")" + "Sending GET request")
// Send request
console.log(url.format(requestUrl))
http.get(url.format(requestUrl), (resp) => {
let data = '';
// A chunk of data has been received.
resp.on('data', (chunk) => {
console.log("GET chunk: " + chunk);
data += chunk;
});
// The whole response has been received. Print out the result.
resp.on('end', () => {
console.log("GET end of response: " + data);
});
}).on("error", (err) => {
console.log("GET Error: " + err);
});
}
Don't miss requiring modules at the top of your file:
http = require("http");
url = require('url')
Also bare in mind that you may use https module for communicating over secured domains and ssl. so these two lines would change:
https = require("https");
...
https.get(url.format(requestUrl), (resp) => { ......
do like me
npm query-string
import queryString from "query-string";
export interface QueryUrl {
limit?: number;
range?: string;
page?: number;
filed?: string;
embody?: string;
q?: string | object;
order?: number;
sort?: string;
}
let parseUri: QueryUrl = queryString.parse(uri.query);
I am using MEANJS 0.6.0 with express#4.16, it's good
Client:
Controller:
var input = { keyword: vm.keyword };
ProductAPi.getOrder(input)
services:
this.getOrder = function (input) {return $http.get('/api/order', { params: input });};
Server
routes
app.route('/api/order').get(products.order);
controller
exports.order = function (req, res) {
var keyword = req.query.keyword
...

Resources