"?"후에 GET 매개 변수에 액세스하는 방법 Express에서?


527

다음과 같은 쿼리에 대한 매개 변수를 얻는 방법을 알고 있습니다.

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

이 경우 req.params.id매개 변수를 얻는 데 사용할 수 있습니다 (예 : 2in /sample/2).

그러나 url과 같은 /sample/2?color=red경우 변수에 color어떻게 액세스 할 수 있습니까?

시도 req.params.color했지만 작동하지 않았습니다.

답변:


776

따라서 express reference 을 확인한 후 req.query.color원하는 값을 반환 한다는 것을 알았 습니다.

req.params는 URL에 ':'가있는 항목을 나타내고 req.query는 '?'와 연관된 항목을 나타냅니다.

예:

GET /something?color1=red&color2=blue

그런 다음 처리기로 표현하십시오.

app.get('/something', (req, res) => {
    req.query.color1 === 'red'  // true
    req.query.color2 === 'blue' // true
})

"id"의 유효성을 검사하는 방법을 알려주시겠습니까?
Anand Raj

1
@AnandRaj : "id"의 유효성을 검사하는 방법은 무엇입니까? 어떤 종류의 유효성 검사를 원하십니까? BTW, 당신은 id다음과 같이 함수 의 가치를 얻을 수 있습니다 : var sampleId = req.params.id;.
Jochem Schulenklopper

4
req.params.whatever최신 버전에서 사용하십시오 .
adelriosantiago

3
req.params다른 마음 req.query! expressjs.com/en/api.html#req.params expressjs.com/en/api.html#req.query @adelriosantiago
caesarsol

81

경로에서 쿼리 문자열 매개 변수의 값을 얻으려면 req.query를 사용하십시오. req.query를 참조하십시오 . 경로에서 http : // localhost : 3000 /? name = satyam 이름 매개 변수의 값을 얻으려면 'Get'경로 처리기가 다음과 같이 진행됩니다.

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

});

아마 완전한 답변을 얻기 위해 querystring에 대한 정보
Schuere

67

업데이트 : req.param() 이제 더 이상 사용되지 않으므로 앞으로이 답변을 사용하지 마십시오.


귀하의 답변이 선호되는 방법이지만,로 URL, 게시물 및 경로 매개 변수에 모두 액세스 할 수 있다고 지적했습니다 req.param(parameterName, defaultValue).

귀하의 경우 :

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

빠른 가이드에서 :

조회는 다음 순서로 수행됩니다.

  • 필수 매개 변수
  • 요청 바디
  • 요청

이 안내서에는 다음 내용이 나와 있습니다.

각 객체의 입력을 실제로 받아들이지 않는 한 req.body, req.params 및 req.query에 직접 액세스하는 것이 명확해야합니다.

그러나 실제로는 실제로 req.param()충분히 명확하고 특정 유형의 리팩토링을 더 쉽게 만듭니다.


53

쿼리 문자열과 매개 변수가 다릅니다.

단일 라우팅 URL에서 두 가지를 모두 사용해야합니다

아래 예제가 도움이 될 수 있는지 확인하십시오.

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

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

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

});

두 번째 세그먼트를 전달하는 링크는 id 예제입니다. http : // localhost : port / sample / 123

문제가 발생하면 '?'를 사용하여 변수를 쿼리 문자열로 전달을 사용하십시오. 운영자

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

     var id = req.query.id; 

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

    });

이 예제와 같은 링크를 얻으십시오 : http : // localhost : port / sample? id = 123

단일 예제에서 둘 다

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

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

});

링크 예 얻기 : http : // localhost : port / sample / 123? id = 123


2
감사합니다이 답변은 매우 도움이되었습니다!
Bruno Tavares

44

@Zugwait의 답변이 맞습니다. req.param()더 이상 사용되지 않습니다. 당신이 사용한다 req.params, req.query또는 req.body.

그러나 더 명확하게하기 위해 :

req.params경로 값만 채워집니다. 즉,와 같은 경로가있는 경우 in 또는에 /users/:id액세스 할 수 있습니다 .idreq.params.idreq.params['id']

req.queryreq.body로 채워집니다 모든 관계없이 경로에 여부에 PARAMS. 물론 쿼리 문자열의 매개 변수는에서 사용할 수 있으며 req.query게시물 본문의 매개 변수는에서 사용할 수 있습니다 req.body.

따라서 color경로에없는 것처럼 질문에 대답 하면 req.query.color또는 을 사용하여 얻을 수 있습니다 req.query['color'].


17

Express 매뉴얼은 req.query 를 사용하여 QueryString에 액세스 해야한다고 말합니다 .

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

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

});

7
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!')
)

7
이 코드 스 니펫은 제한적이고 즉각적인 도움이 될 수 있습니다. 적절한 설명은 크게 장기 가치를 향상 할 보여줌으로써 이 문제에 대한 좋은 해결책이고, 다른 유사한 질문을 미래의 독자들에게 더 유용 할 것입니다. 제발 편집 당신이 만든 가정 등 일부 설명을 추가 할 답변을.
iBug

2

Express에서 내 앱 중 일부와 함께 사용하기 시작한 좋은 기술은 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;

그런 다음 컨트롤러 본문 또는 급행 요청 체인 범위의 다른 곳에서 다음과 같이 사용할 수 있습니다.

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

이를 통해 사용자가 요청과 함께 전송 한 모든 "사용자 정의 데이터"를 "탐색"하는 것이 편리하고 편리합니다.

노트

왜 'props'필드입니까? 이것이 컷 스 니펫 이었기 때문에이 기술을 여러 API에 사용하고 아래 예제와 같이 인증 / 권한 부여 데이터를이 객체에 저장합니다.

/*
 * @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";
    }
} 

1
엔드 포인트를 유지 관리하기가 어렵 기 때문에 이것은 아마도 나쁜 생각입니다. 더 이상 클라이언트가 매개 변수를 전달하는 데 사용할 메소드를 알 수 없습니다.
sdgfsdh 12

그것은 실제로이 분야의 출처를 알 필요없이 정직한이 접근법의 주요 장점 중 하나입니다. 위의 ExpressData 클래스는 브리지 역할을하여 비즈니스 로직을 모듈화하여 고속 컨트롤러 경로에서 멀어지게합니다. 즉, 'req.query', 'req.body'를 코드로 베이킹하지 않습니다. 비즈니스 코드를 쉽게 테스트 할 수 있으며 명시 적으로 벗어납니다.
Lee Brindley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.