วิธีรับตัวแปร GET (สตริงข้อความค้นหา) ใน Express.js บน Node.js


1192

เราสามารถรับตัวแปรในสตริงการสืบค้นใน Node.js เหมือนกับที่เราได้รับ$_GETใน PHP หรือไม่?

ฉันรู้ว่าใน Node.js เราจะได้รับ URL ในคำขอ มีวิธีการรับพารามิเตอร์สตริงแบบสอบถามหรือไม่


6
@ whitequark คำตอบ (คำตอบที่ได้คะแนนมากที่สุด) ควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง คุณคิดที่จะอัปเดตสำหรับคนอื่น ๆ ด้วยคำถามเดียวกันกับคุณหรือไม่เมื่อคำถามของคุณ?
Dev01

ใช้วัตถุ
คิวรี

@ Dev01 เขาไม่ได้ทำงานตั้งแต่ 2557 lol
John Balvin Arias

หากใครกำลังมองหา Nodejs API สำเร็จรูปด้วย Expressjs และ MongoDB ลองสิ่งนี้: github.com/maitraysuthar/rest-api-nodejs-mongodb
Maitray Suthar

คำตอบ:


1181

ใน Express คุณได้ทำเสร็จแล้วและคุณสามารถใช้req.queryเพื่อทำสิ่งต่อไปนี้:

var id = req.query.id; // $_GET["id"]

มิฉะนั้นใน NodeJS คุณสามารถเข้าถึงreq.urlและurlโมดูลbuiltin ไปที่ [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;

24
ให้ความสนใจที่นี่: .parse (url, true ) url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
befzz

มีฟังก์ชั่นเพิ่มเติม / ฟังก์ชั่นใดที่ดีกว่า Hapi ให้ (ถ้ามี)?
BaltoStar

180
เป็นที่ยอมรับ แต่ไม่ใช่คำตอบที่ต้องการ ดูด้านล่าง! ใช้req.query
Cheeso

2
คำตอบของ mikemcneil ด้านล่างเป็นตัวเลือกที่ดีกว่า ใช้req.queryหรือreq.param(ซึ่งต่างจากreq.params... ดูด้านล่าง
MindJuice

9
-1 . โค้ดด้านบนเป็นสิ่งที่มีน้ำหนักมาก - สิ่งที่นักพัฒนาซอฟต์แวร์จะต้องทำการปรับปรุงในทันที นี่คือคำตอบสำหรับ " วิธีรับสตริงการสืบค้นของ URL? " - URL ที่เป็นปัญหาเพิ่งเกิดขึ้นกับวัตถุชื่อrequestและไม่มีอะไรเกี่ยวข้องกับ Express ดูคำตอบของ @ whitequark ด้านล่าง (ใช้request.query)
lunohodov

1649

เนื่องจากคุณได้กล่าว 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);

68
เป็นมูลค่าการกล่าวขวัญว่าคุณควรใช้req.query.idไม่จำเป็นต้องใช้สัญกรณ์วงเล็บ
alex

หากต้องการติดตั้งแบบด่วนให้ทำ: ใช่ | sudo npm install -g express --- ฉันพยายามแก้ไข แต่ Alexis King ถูกเปลี่ยนกลับแล้ว
เฟลิเป้

ในคำถามที่เขากำลังมองหาวิธีที่จะได้รับพารามิเตอร์สตริงแบบสอบถามทั้งหมดเช่นอาร์เรย์ คำตอบที่ถูกต้องคือ: app.get ('/', ฟังก์ชั่น (req, res) {console.log (req.query);});
Richard Torcato

463

req.queryด่วนใช้

req.paramsรับพารามิเตอร์เส้นทางเท่านั้นไม่ใช่พารามิเตอร์สตริงแบบสอบถาม ดูเอกสารด่วนหรือใบเรือ :

(req.params) ตรวจสอบ params เส้นทางเช่น: / user /: id

(req.query) ตรวจสอบพารามิเตอร์สตริงข้อความค้นหาตัวอย่าง:? id = 12 ตรวจสอบพารามิเตอร์ร่างกายแบบ urlencoded

(req.body), ex: id = 12 ในการใช้เนื้อหาคำขอ urlencoded req.body ควรเป็นวัตถุ สามารถทำได้โดยใช้มิดเดิลแวร์ _express.bodyParser

ที่กล่าวมาส่วนใหญ่คุณต้องการรับค่าพารามิเตอร์โดยไม่คำนึงถึงแหล่งที่มา req.param('foo')ในกรณีที่ใช้

ค่าของพารามิเตอร์จะถูกส่งคืนไม่ว่าจะเป็นตัวแปรที่อยู่ในพารามิเตอร์เส้นทางสตริงการสืบค้นหรือเนื้อหาคำขอที่เข้ารหัส

Side note- ถ้าคุณกำลังเล็งที่จะได้รับจุดตัดของทั้งสามประเภทค่าคำขอ (คล้ายกับของ PHP $_REQUEST), คุณเพียงแค่ต้องผสานพารามิเตอร์ together-- นี่เป็นวิธีที่ผมตั้งขึ้นใน Sails โปรดทราบว่าวัตถุพารามิเตอร์เส้นทาง / เส้นทาง ( req.params) มีคุณสมบัติอาร์เรย์ดังนั้นลำดับการสั่งซื้อ (แม้ว่าอาจมีการเปลี่ยนแปลงใน Express 4 )


req.param ('STRING') เป็นคำตอบที่ถูกต้อง ดูที่นี่: stackoverflow.com/questions/17007997/… (เลื่อนลงเพื่อตอบด้านล่างคำตอบที่ยอมรับ)
Joseph Juhnke

3
@deltab นี่คือลิงก์ไปยังreq.paramsในเอกสาร Sails: sailsjs.org/#/documentation/reference/req/req.reams.html และเอกสารด่วนใหม่: expressjs.com/4x/api.html#req.params
mikermcneil

7
req.param เลิกใช้แล้วใน express 4.x ควรใช้ req.params, req.body หรือ req.query แทน: expressjs.com/en/4x/api.html#req.param
swang

@swang ถูกต้อง - ฉันตรวจสอบอีกครั้งกับ Doug Wilson เมื่อเร็ว ๆ นี้และreq.param()ฟังก์ชั่นผู้ช่วยน่าจะถูกลบใน Express 5 โดยสมบูรณ์ซึ่งจะไม่ใกล้จนกว่าจะถึงเวลาต่อมาในปี 2560 ดังนั้นฉันจะรอแก้ไข คำตอบนี้จนกระทั่งแล้ว ในเวลาเฉลี่ย: มันปลอดภัยที่จะใช้req.param()กับ Express <= 3.x / Sails <= 0.12 และด้วย Express 4 รุ่นล่าสุดที่มีให้ใช้แม้ว่าจะมีข้อความบันทึกการคัดค้าน (สำหรับผู้ใช้ Sails: การใช้งานของreq.param()จะย้ายไปเป็นแกนหลักของ Sails v1.0 และจะยังคงได้รับการสนับสนุนอย่างเต็มที่ใน Sails ในอนาคต)
mikermcneil

142

สำหรับ Express.js คุณต้องการทำreq.params:

app.get('/user/:id', function(req, res) {
  res.send('user' + req.params.id);    
});

8
เพื่อดึงข้อมูลตัวแปร GET ใน express.js คุณสามารถใช้ req.query
เบ็นซินแคลร์

6
@Andy req.params ดีกว่าเพราะ: req.param (ชื่อ [, ค่าเริ่มต้น]) จะ: คืนค่าชื่อ param เมื่อมีอยู่หรือเป็นค่าเริ่มต้น ตรวจสอบ params เส้นทาง (req.params), ex: / user /: id ตรวจสอบ params ของสตริงการค้นหา (req.query), ex:? id = 12Checks params body parlencoded (req.body), ex: id = 12 เพื่อใช้คำร้องขอ urlencoded เนื้อความ req.body ควรเป็นวัตถุ สามารถทำได้โดยใช้มิดเดิลแวร์ _express.bodyParser
Cris-O

ฉันไม่ทราบว่า req.param ตรวจสอบ req.query ขอบคุณสำหรับบันทึกนี้
เบ็นซินแคลร์

3
req.param ('parameterName') จะตรวจสอบ req.body, req.query และ req.params แต่ถ้าคุณต้องการให้พารามิเตอร์เคียวรีทั้งหมดเป็นวัตถุคุณควรใช้ req.query
mikermcneil

1
@mikermcneil คุณอาจผสม req.param () และ req.params (วัตถุ) ตาม expressjs docs req.param () ค้นหาค่าในวัตถุทั้งสาม expressjs.com/api.html#req.param
เบ็นซินแคลร์

78

ฉันเรียนรู้จากคำตอบอื่น ๆ และตัดสินใจใช้รหัสนี้ในเว็บไซต์ของฉัน:

var query = require('url').parse(req.url,true).query;

จากนั้นคุณสามารถโทร

var id = query.id;
var option = query.option;

ควรรับ URL ที่ไหน

/path/filename?id=123&option=456

2
จะไม่ใช้ ID และตัวเลือกไม่ได้ถูกกำหนดเนื่องจากการสืบค้นเป็นเพียงสตริง? เราจะต้องแยกพารามิเตอร์ทั้งสองออกเป็น regex หรือสิ่งที่คล้ายกัน
ossek

1
@ossek ผมเชื่อว่าการกระทำของการก่อให้เกิดparseบนreq.urlแปลงไปยังวัตถุ
whitfin

1
@ ossek เขาให้ความจริงเป็นอาร์กิวเมนต์ที่สองสำหรับ url.parse ซึ่งทำให้คุณสมบัติคิวรีชี้ไปที่วัตถุ (และใช้โมดูลการสอบถามภายใน) คุณสามารถค้นหาเพิ่มเติมได้ในเอกสาร [ที่นี่] ( nodejs.org/docs / latest / api / … )
Bharat

ทำงาน .... ขอบคุณมาก !!!
Prateek Gupta


48

หากคุณใช้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)


ใช้การทำลายวัตถุด้วยค่าเริ่มต้น! +1
ผู้นำนักพัฒนาซอฟต์แวร์

43

มี 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);

40

คุณควรทำสิ่งนี้:

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")
})

26

อัปเดต 4 พฤษภาคม 2557

คำตอบเก่าเก็บไว้ที่นี่: 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

ฉันได้รับ ID: บางอย่าง


(มีหลายสิ่งเปลี่ยนไปตั้งแต่คำตอบของฉันและฉันเชื่อว่ามันคุ้มค่าที่จะต้องรักษาสิ่งต่าง ๆ ให้ทันสมัย)


20

เซิร์ฟเวอร์ 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"


3
คุณไม่จำเป็นต้องใช้ sys ในตัวอย่างนี้
danwellman

20

Whitequark ตอบสนองอย่างดี แต่ด้วยเวอร์ชันปัจจุบันของ 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'));
})

15

มันง่ายมาก:

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



13

คุณสามารถใช้กับด่วน ^ 4.15.4:

var express = require('express'),
    router = express.Router();
router.get('/', function (req, res, next) {
    console.log(req.query);
});

หวังว่านี่จะช่วยได้


6

ในexpress.jsคุณจะได้รับมันสวยง่ายทั้งหมดที่คุณต้องทำในฟังก์ชั่นการควบคุมของคุณคือ:

app.get('/', (req, res, next) => {
   const {id} = req.query;
   // rest of your code here...
})

และนั่นคือทั้งหมดสมมติว่าคุณใช้ไวยากรณ์ es6

PD {id}ย่อมาจากคุณสมบัติObject destructuringใหม่ของ es6


ฉันใช้เอ็กซ์เพรสกับโหนดดังนั้นมันจึงทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน ขอบคุณ!
user752746

4
app.get('/user/:id', function(req, res) {
    res.send('user' + req.params.id);    
});

คุณสามารถใช้สิ่งนี้หรือคุณสามารถลอง body-parser สำหรับการวิเคราะห์องค์ประกอบพิเศษจากพารามิเตอร์คำขอ


1
คุณช่วยอธิบายเพิ่มเติมได้อย่างไรว่าสิ่งนี้ตอบคำถามได้อย่างไร
Nico Haase

และวิธีนี้แยกรายการพารามิเตอร์ที่มีอยู่ได้อย่างไร
Nico Haase

คุณสามารถใช้โมดูล body-parser จาก node.js
Mehedi Abdullah

1

มันง่ายจริง ๆ :

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

0

คุณสามารถใช้โมดูล 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
});


0

จากมุมมองของฉันฉันคิดว่าหลายคนผสมผสานสองแนวคิดที่แตกต่างกัน ในระหว่างการพัฒนาส่วนที่เหลือฉันคุ้นเคยกับการส่งผ่านข้อมูลใน URL ด้วยสองวิธี "ตัวแปรเส้นทาง" และ "พารามิเตอร์คำขอ" (พารามิเตอร์แบบสอบถาม) RFC อธิบายส่วนต่างๆของ URI ดังนี้: ป้อนคำอธิบายลิงก์ที่นี่ดังนั้นฉันเข้าใจว่าผู้เขียนต้องการทราบวิธีการส่งพารามิเตอร์คำขอ ฉันเพียงต้องการทำให้หัวข้อเข้าใจง่ายขึ้น แต่มีการกล่าวถึงวิธีแก้ปัญหาที่นี่หลายครั้ง

คุณสามารถรับพารามิเตอร์เคียวรีจาก URI ด้วยrequest.query.<name of the parameter>วิธีแก้ปัญหาที่สองที่กล่าวถึงคือrequest.params.<name of the parameter>สิ่งนี้คุณสามารถรับตัวแปรพา ธ


0

ดังนั้นมีสองวิธีที่สามารถรับ "id" นี้: 1) ใช้ params: โค้ด params จะมีหน้าตาดังนี้: สมมติว่าเรามีอาร์เรย์

const courses = [{
    id: 1,
    name: 'Mathematics'
},
{
    id: 2,
    name: 'History'
}
];

จากนั้นสำหรับ params เราสามารถทำสิ่งที่ชอบ:

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);
});


0

หากคุณต้องการส่งGETคำขอไปยังIPa Domain( a คำตอบอื่น ๆ ไม่ได้กล่าวถึงคุณสามารถระบุ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) => { ......

-1

ทำไมไม่ผสมกับรหัสเซิร์ฟเวอร์

เช่น . PHP

<script>
var ip=<?php echo($_SERVER['REMOTE_ADDR']);?>

</script>

-2

ฉันใช้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
  ...

-3

-------- การเข้าถึงข้อมูลสตริงการสืบค้น -------
สมมติว่านี่คือลิงค์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}) })
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.