Чи можемо ми отримати змінні в рядку запиту в 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 у своїх тегах, ось відповідь, що стосується експресу: використовуйте 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 Перевіряє параметри тіла
(req.body), наприклад: 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()
функція помічника, ймовірно, буде повністю видалена в Експресі 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
і запустіть на консолі, ввівши "вузол parse.js".
Уайткварк відповів приємно. Але для поточних версій Node.js та Express.js потрібен ще один рядок. Обов’язково додайте "вимагати 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", "activatekey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}
Щоб надрукувати конкретні:
console.log("activatekey: " + req.query.activatekey);
Вихідні дані
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);
});
Ви можете використовувати це або ви можете спробувати аналізатор тіла для розбору спеціального елемента з параметрів запиту.
Насправді це просто:
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;
У expressjs це робиться,
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>
і за допомогою цього ви можете отримати змінні шляху.
Отже, є два способи отримання цього "id": 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
а також 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})
})