Можем ли мы получить переменные в строке запроса в Node.js так же, как мы получаем их $_GET
в PHP?
Я знаю, что в Node.js мы можем получить URL в запросе. Есть ли способ получить параметры строки запроса?
Можем ли мы получить переменные в строке запроса в Node.js так же, как мы получаем их $_GET
в PHP?
Я знаю, что в Node.js мы можем получить URL в запросе. Есть ли способ получить параметры строки запроса?
Ответы:
В Express это уже сделано для вас, и вы можете просто использовать req.query для этого:
var id = req.query.id; // $_GET["id"]
В противном случае в NodeJS вы можете получить доступ к req.url и встроенному url
модулю для [url.parse] ( https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost ) его вручную:
var url = require('url');
var url_parts = url.parse(request.url, true);
var query = url_parts.query;
url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
req.query
req.query
или req.param
(что отличается от req.params
... см. Ниже.
request
и не имеет ничего общего с Express. Смотрите ответ @ whitequark ниже (используйте request.query
)
Поскольку вы упомянули Express.js в своих тегах, вот специальный ответ Express: используйте req.query . Например
var express = require('express');
var app = express();
app.get('/', function(req, res){
res.send('id: ' + req.query.id);
});
app.listen(3000);
req.query.id
, нет необходимости использовать скобки.
В Express используйте req.query
.
req.params
получает только параметры маршрута, а не параметры строки запроса. Смотрите экспресс или паруса документации:
(req.params) Проверяет параметры маршрута, например: / user /: id
(req.query) Проверяет параметры строки запроса, например:? id = 12 Проверяет параметры тела в кодировке urlencoded
(req.body), ex: id = 12 Для использования тел запросов с урлен-кодом req.body должен быть объектом. Это можно сделать с помощью промежуточного программного обеспечения _express.bodyParser.
Тем не менее, в большинстве случаев вы хотите получить значение параметра независимо от его источника. В этом случае используйте req.param('foo')
.
Значение параметра будет возвращено независимо от того, была ли переменная в параметрах маршрута, строке запроса или в зашифрованном теле запроса.
Примечание: если вы хотите пересечь все три типа параметров запроса (аналогично PHP $_REQUEST
), вам просто нужно объединить параметры вместе - вот как я это настроил в Sails . Имейте в виду, что у объекта параметров пути / маршрута req.params
есть свойства массива, поэтому порядок имеет значение (хотя это может измениться в Express 4 )
req.params
на документы Sails: sailsjs.org/#/documentation/reference/req/req.params.html и новые экспресс-документы: expressjs.com/4x/api.html#req.params
req.param()
вспомогательная функция, вероятно, будет полностью удалена в Express 5. Это не будет неизбежно до некоторого времени позже в 2017 году, поэтому я подожду редактировать этот ответ до тех пор. В то же время: безопасно использовать req.param()
с Express <= 3.x / Sails <= 0.12 и с последней доступной версией Express 4, хотя и с сообщением журнала устаревания. (Для пользователей Sails: реализация req.param()
Sails v1.0 перейдет в ядро, и в дальнейшем она будет полностью поддерживаться в Sails.)
Для Express.js вы хотите сделать req.params
:
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
Я учился на других ответах и решил использовать этот код на своем сайте:
var query = require('url').parse(req.url,true).query;
Тогда вы можете просто позвонить
var id = query.id;
var option = query.option;
где должен быть URL для получения
/path/filename?id=123&option=456
parse
на req.url
обращенных к объекту.
//get query¶ms 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"}
})
Если вы используете ES6 и Express , попробуйте этот destructuring
подход:
const {id, since, fields, anotherField} = request.query;
В контексте:
const express = require('express');
const app = express();
app.get('/', function(req, res){
const {id, since, fields, anotherField} = req.query;
});
app.listen(3000);
Вы также можете использовать значения по умолчанию с destructuring
:
// 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)
Есть 2 способа передачи параметров с помощью метода GET.
Метод 1. Подход MVC, в котором вы передаете такие параметры, как / routename /: paramname.
В этом случае вы можете использовать req.params.paramname, чтобы получить значение параметра. Например, см. Код ниже, где я Я ожидаю, что Id в качестве
ссылки может быть как: 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);
Метод 2: Общий подход: передача переменных в виде строки запроса с использованием '?' оператор
Например, обратитесь к приведенному ниже коду, где я ожидаю, что Id в качестве
ссылки на параметр запроса может выглядеть следующим образом: 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);
Вы должны быть в состоянии сделать что-то вроде этого:
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")
})
ОБНОВЛЕНИЕ 4 мая 2014
Старый ответ сохранился здесь: https://gist.github.com/stefek99/b10ed037d2a4a323d638
1) Установите экспресс: 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) Запустите приложение: node app.js
3) Зайдите в браузер: http://localhost:3000/endpoint?id=something
Я получил удостоверение личности: что-то
(с момента моего ответа многое изменилось, и я считаю, что это стоит держать в курсе)
Небольшой HTTP-сервер Node.js, прослушивающий порт 9080, анализирующий данные GET или POST и отправляющий их обратно клиенту как часть ответа:
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);
Сохраните его как parse.js
и запустите на консоли, введя "node parse.js".
Whitequark ответил хорошо. Но в текущих версиях Node.js и Express.js требуется еще одна строка. Обязательно добавьте 'require http' (вторая строка). Я разместил здесь более полный пример, который показывает, как этот вызов может работать. После запуска введите http://localhost:8080/?name=abel&fruit=apple
в браузере, и вы получите крутой ответ на основе кода.
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'));
})
Это так просто:
Пример URL:
http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK
Вы можете распечатать все значения строки запроса, используя:
console.log("All query strings: " + JSON.stringify(req.query));
Вывод
Все строки запроса: {"id": "3", "activkey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}
Для печати конкретного:
console.log("activatekey: " + req.query.activatekey);
Вывод
Ключ активации: $ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjzfUrqLrgS3zXJVfVRK
В express.js
вы можете получить его довольно легко, все , что вам нужно сделать в функции контроллера является:
app.get('/', (req, res, next) => {
const {id} = req.query;
// rest of your code here...
})
И это все, если вы используете синтаксис es6.
Оплаченный {id}
расшифровывается Object destructuring
как новая функция es6.
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
Вы можете использовать это или попробовать body-parser для разбора специального элемента из параметров запроса.
Это на самом деле просто:
const express= require('express');
const app = express();
app.get('/post', (req, res, next) => {
res.send('ID:' + req.query.id + ' Edit:'+ req.query.edit);
});
app.listen(1000);
// localhost:1000/post?id=123&edit=true
// output: ID: 123 Edit: true
Вы можете использовать модуль url для сбора параметров с помощью url.parse
var url = require('url');
var url_data = url.parse(request.url, true);
var query = url_data.query;
В экспрессе это сделано,
var id = req.query.id;
Например:
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
});
В Express мы можем просто использовать req.query.<name>
. Это работает так же, как $_GET['name']
в PHP.
С моей точки зрения, я думаю, что многие люди смешивают два разных понятия. Во время разработки REST я был знаком с передачей информации в URL двумя способами: «переменные пути» и «параметры запроса» (параметры запроса). RFC описывает части URI следующим образом: введите здесь описание ссылки. Я понял, что автору хотелось бы знать, как передавать параметры запроса. Я хотел бы только облегчить понимание темы, но решение упоминалось здесь много раз.
Вы можете получить параметры запроса из URI с request.query.<name of the parameter>
, второе упомянутое решение было, request.params.<name of the parameter>
и с этим вы можете получить переменные пути.
Таким образом, есть два способа получения этого «идентификатора»: 1) использование параметров: параметры кода будут выглядеть примерно так: скажем, у нас есть массив,
const courses = [{
id: 1,
name: 'Mathematics'
},
{
id: 2,
name: 'History'
}
];
Тогда для параметров мы можем сделать что-то вроде:
app.get('/api/posts/:id',(req,res)=>{
const course = courses.find(o=>o.id == (req.params.id))
res.send(course);
});
2) Другой метод заключается в использовании параметров запроса. поэтому URL будет выглядеть примерно так: «..... \ api \ xyz? id = 1», где «? id = 1» - это часть запроса. В этом случае мы можем сделать что-то вроде:
app.get('/api/posts',(req,res)=>{
const course = courses.find(o=>o.id == (req.query.id))
res.send(course);
});
var express = require('express');
var app = express();
app.get('/', function(req, res){
res.send('id: ' + req.query.id);
});
app.listen(3000);
Если вам когда-либо понадобится отправить GET
запрос IP
как a, так и a Domain
(в других ответах не упоминалось, что вы можете указать port
переменную), вы можете использовать эту функцию:
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);
});
}
Не пропустите обязательные модули в верхней части вашего файла:
http = require("http");
url = require('url')
Также помните, что вы можете использовать https
модуль для связи по защищенным доменам и ssl. поэтому эти две строки изменились бы:
https = require("https");
...
https.get(url.format(requestUrl), (resp) => { ......
Я использую MEANJS 0.6.0 с express@4.16, это хорошо
Клиент:
контроллер:
var input = { keyword: vm.keyword };
ProductAPi.getOrder(input)
Сервисы:
this.getOrder = function (input) {return $http.get('/api/order', { params: input });};
сервер
маршруты
app.route('/api/order').get(products.order);
контроллер
exports.order = function (req, res) {
var keyword = req.query.keyword
...
-------- Доступ к данным строки запроса -------
Предположим, что это ссылка http://webapplog.com/search?term=node.js&page=1
Так что в экспрессе вы можете использовать:
req.query.term
req.query.page
или req.query
(он извлечет запрос в объекте)
app.get('http://webapplog.com/search?term=node.js&page=1',(req, res)=>{
res.json({term:req.query.term, page:req.query.page})
})
-------- Доступ к параметрам URL -------
Предположим, что это ссылка http://webapplog.com/node.js/pages/100
Итак, в экспрессе вы можете использовать:
app.get('/:term/pages/:page',....)
req.params.term
req.params.page
app.get('http://webapplog.com/:term/pages/:page',(req, res)=>{
res.json({term:req.params.term, page:req.params.page})
})