Чи можемо ми отримати змінні в рядку запиту в 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.termreq.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.termreq.params.pageapp.get('http://webapplog.com/:term/pages/:page',(req, res)=>{
res.json({term:req.params.term, page:req.params.page})
})