2013-06-09 46 views
354

tôi biết làm thế nào để có được những params cho các truy vấn như thế này:Cách truy cập thông số GET sau "?" trong Express?

app.get('/sample/:id', routes.sample); 

Trong trường hợp này, tôi có thể sử dụng req.params.id để có được những thông số (ví dụ 2 trong /sample/2).

Tuy nhiên, đối với url như /sample/2?color=red, làm cách nào tôi có thể truy cập biến số color?

Tôi đã thử req.params.color nhưng nó không hoạt động.

Trả lời

485

Vì vậy, sau khi xem số express reference, tôi thấy rằng req.query.color sẽ trả về giá trị tôi đang tìm kiếm.

+0

Bạn có thể cho tôi biết cách xác thực "id" không? –

+1

@AnandRaj: ý của bạn là gì: cách xác thực "id"? Bạn muốn loại xác thực nào?BTW, bạn có thể nhận giá trị 'id' trong hàm của bạn như sau:' var sampleId = req.params.id; '. –

+0

Sử dụng 'req.params.whatever' trong các phiên bản mới nhất. – adelriosantiago

58

Cập nhật:req.param() hiện không được chấp nhận, do đó, chuyển tiếp không sử dụng câu trả lời này.


câu trả lời của bạn là cách ưa thích để làm điều đó, tuy nhiên tôi nghĩ rằng tôi muốn chỉ ra rằng bạn cũng có thể truy cập vào các thông số url, bưu điện, và định tuyến tất cả với req.param(parameterName, defaultValue).

Trong trường hợp của bạn:

var color = req.param('color'); 

Từ hướng dẫn rõ ràng:

tra cứu được thực hiện theo trình tự sau:

  • req.params
  • req.body
  • req.query

Lưu ý hướng dẫn không rõ như sau:

Truy cập trực tiếp đến req.body, req.params, và req.query nên ưa chuộng cho rõ ràng - trừ khi bạn thực sự chấp nhận đầu vào từ mỗi đối tượng.

Tuy nhiên trong thực tế tôi đã thực sự tìm thấy req.param() đủ rõ ràng và làm cho một số loại tái cấu trúc dễ dàng hơn.

+6

Điều này không được chấp nhận trong Express mới nhất. http://expressjs.com/api.html#req.param – NullSpace

39

@ Câu trả lời của Zugwait là chính xác. req.param() không còn được dùng nữa. Bạn nên sử dụng req.params, req.query hoặc req.body.

Nhưng chỉ để làm cho nó rõ ràng hơn:

req.params sẽ được áp dụng với chỉ các giá trị đường. Tức là, nếu bạn có lộ trình như /users/:id, bạn có thể truy cập id hoặc trong req.params.id hoặc req.params['id'].

req.queryreq.body sẽ được điền với tất cả thông số, bất kể chúng có ở trong tuyến đường hay không.Tất nhiên, các tham số trong chuỗi truy vấn sẽ có sẵn trong req.query và các tham số trong nội dung bài đăng sẽ có sẵn trong req.body.

Vì vậy, trả lời câu hỏi của bạn, vì color không có trong tuyến đường, bạn sẽ có thể nhận được nó bằng cách sử dụng req.query.color hoặc req.query['color'].

13

Hướng dẫn nhanh nói rằng bạn nên sử dụng req.query để truy cập QueryString.

// Requesting /display/post?size=small 
app.get('/display/post', function(req, res, next) { 

    var isSmall = req.query.size === 'small'; // > true 
    // ... 

}); 
19

Hey Chuỗi truy vấn và thông số khác nhau.

Bạn cần sử dụng cả hai trong url định tuyến đơn

Vui lòng kiểm tra các ví dụ bên dưới để giúp ích cho bạn.

app.get('/sample/:id', function(req, res) { 

var id = req.params.id; //or use req.param('id') 

    ................ 

}); 

Nhận liên kết vượt qua đoạn thứ hai của bạn là ví dụ id của bạn: '?' http://localhost:port/file-upload/123

Nếu bạn phải đối mặt với vấn đề xin vui lòng sử dụng các biến Passing như chuỗi truy vấn sử dụng điều hành

app.get('/sample', function(req, res) { 

    var id = req.query.id; 

     ................ 

    }); 

Nhận liên kết của bạn như ví dụ sau: http://localhost:port/sample?id=123

Cả hai trong ví dụ đơn

app.get('/sample/:id', function(req, res) { 

var id = req.params.id; //or use req.param('id') 
var id2 = req.query.id; 
    ................ 

}); 

bài viết link ví dụ ví dụ: http://localhost:port/sample/123?id=123

52

Sử dụng req.query, để có được anh ta giá trị trong tham số chuỗi truy vấn trong tuyến đường. Tham khảo req.query. Say nếu trong một tuyến đường, http://localhost:3000/?name=satyam bạn muốn nhận được giá trị cho tham số tên, sau đó 'Get' xử lý tuyến đường của bạn sẽ đi như thế này: -

app.get('/', function(req, res){ 
    console.log(req.query.name); 
    res.send('Response send to client::'+req.query.name); 

}); 
+0

có lẽ một số thông tin về chuỗi truy vấn để có được câu trả lời hoàn chỉnh – Schuere

0

Một kỹ thuật tốt đẹp tôi đã bắt đầu sử dụng với một số ứng dụng của tôi trên express là tạo một đối tượng kết hợp các truy vấn, các tham số và các trường nội dung của đối tượng yêu cầu của express.

//./express-data.js 
const _ = require("lodash"); 

class ExpressData { 

    /* 
    * @param {Object} req - express request object 
    */ 
    constructor (req) { 

     //Merge all data passed by the client in the request 
     this.props = _.merge(req.body, req.params, req.query); 
    } 

} 

module.exports = ExpressData; 

Sau đó, trong cơ thể điều khiển của bạn, hoặc bất cứ nơi nào khác trong phạm vi của chuỗi yêu cầu rõ ràng, bạn có thể sử dụng một cái gì đó như dưới đây:

//./some-controller.js 

const ExpressData = require("./express-data.js"); 
const router = require("express").Router(); 


router.get("/:some_id", (req, res) => { 

    let props = new ExpressData(req).props; 

    //Given the request "/592363122?foo=bar&hello=world" 
    //the below would log out 
    // { 
    // some_id: 592363122, 
    // foo: 'bar', 
    // hello: 'world' 
    // } 
    console.log(props); 

    return res.json(props); 
}); 

này làm cho nó đẹp và tiện dụng để chỉ "đi sâu" vào tất cả "dữ liệu tùy chỉnh" mà người dùng có thể đã gửi cùng với yêu cầu của họ.

Note

Tại sao trường 'đạo cụ'? Vì đó là đoạn trích cắt giảm, tôi sử dụng kỹ thuật này trong một số API của mình, tôi cũng lưu trữ dữ liệu xác thực/ủy quyền vào đối tượng này, ví dụ bên dưới.

/* 
* @param {Object} req - Request response object 
*/ 
class ExpressData { 

    /* 
    * @param {Object} req - express request object 
    */ 
    constructor (req) { 

     //Merge all data passed by the client in the request 
     this.props = _.merge(req.body, req.params, req.query); 

     //Store reference to the user 
     this.user = req.user || null; 

     //API connected devices (Mobile app..) will send x-client header with requests, web context is implied. 
     //This is used to determine how the user is connecting to the API 
     this.client = (req.headers) ? (req.headers["x-client"] || (req.client || "web")) : "web"; 
    } 
} 
+0

Đây có thể là một ý tưởng tồi vì nó làm cho việc duy trì điểm cuối của bạn trở nên khó khăn hơn. Bạn không còn biết khách hàng phương pháp nào sẽ sử dụng để chuyển các tham số. – sdgfsdh

+0

Đó thực sự là một trong những lợi thế chính của cách tiếp cận này là trung thực, không phải biết các lĩnh vực đến từ đâu. Lớp ExpressData ở trên hoạt động như một cầu nối, cho phép bạn mô đun hóa logic nghiệp vụ của mình, di chuyển nó ra khỏi các tuyến điều khiển tốc hành, tức là bạn không nướng 'req.query', 'req.body' vào mã của bạn, điều này cũng làm cho mã doanh nghiệp của bạn dễ dàng kiểm tra, hoàn toàn nằm ngoài khả năng diễn đạt. –

-1
const express = require('express') 
const bodyParser = require('body-parser') 
const { usersNdJobs, userByJob, addUser , addUserToCompany } = require ('./db/db.js') 

const app = express() 
app.set('view engine', 'pug') 
app.use(express.static('public')) 
app.use(bodyParser.urlencoded({ extended: false })) 
app.use(bodyParser.json()) 

app.get('/', (req, res) => { 
    usersNdJobs() 
    .then((users) => { 
     res.render('users', { users }) 
    }) 
    .catch(console.error) 
}) 

app.get('/api/company/users', (req, res) => { 
    const companyname = req.query.companyName 
    console.log(companyname) 
    userByJob(companyname) 
    .then((users) => { 
     res.render('job', { users }) 
    }).catch(console.error) 
}) 

app.post('/api/users/add', (req, res) => { 
    const userName = req.body.userName 
    const jobName = req.body.jobName 
    console.log("user name = "+userName+", job name : "+jobName) 
    addUser(userName, jobName) 
    .then((result) => { 
     res.status(200).json(result) 
    }) 
    .catch((error) => { 
     res.status(404).json({ 'message': error.toString() }) 
    }) 
}) 
app.post('/users/add', (request, response) => { 
    const { userName, job } = request.body 
    addTeam(userName, job) 
    .then((user) => { 
    response.status(200).json({ 
     "userName": user.name, 
     "city": user.job 
    }) 
    .catch((err) => { 
    request.status(400).json({"message": err}) 
    }) 
}) 

app.post('/api/user/company/add', (req, res) => { 
    const userName = req.body.userName 
    const companyName = req.body.companyName 
    console.log(userName, companyName) 
    addUserToCompany(userName, companyName) 
    .then((result) => { 
    res.json(result) 
    }) 
    .catch(console.error) 
}) 

app.get('/api/company/user', (req, res) => { 
const companyname = req.query.companyName 
console.log(companyname) 
userByJob(companyname) 
.then((users) => { 
    res.render('jobs', { users }) 
}) 
}) 

app.listen(3000,() => 
    console.log('Example app listening on port 3000!') 
) 
+1

Cảm ơn bạn đã trích đoạn mã này, đoạn mã này có thể cung cấp một số trợ giúp tức thì, có giới hạn. [Giải thích đúng sẽ cải thiện đáng kể giá trị lâu dài của nó] (// meta.stackexchange.com/q/114762/350567) bằng cách hiển thị * tại sao * đây là giải pháp tốt cho vấn đề và sẽ giúp ích cho tương lai độc giả với các câu hỏi tương tự khác. Vui lòng [sửa] câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện. – iBug