programing

Express에서 "?" 다음에 GET 매개 변수에 액세스하는 방법은 무엇입니까?

newstyles 2023. 5. 24. 21:46

Express에서 "?" 다음에 GET 매개 변수에 액세스하는 방법은 무엇입니까?

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

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

이 경우, 저는 사용할 수 있습니다.req.params.id 변수 매변수가예니다옵져를개예()를 가져옵니다.2/sample/2).

, 하만지와 같은 에는 과에같 URL을 사용합니다./sample/2?color=red변수에 액세스하려면 어떻게 해야 합니까?color?

나는 노력했다.req.params.color하지만 그것은 작동하지 않았다.

그래서, 저는 명시적 참조를 확인한 후, 그것을 발견했습니다.req.query.color제가 찾고 있는 가치를 돌려줄 겁니다

req.params는 URL에 ':'가 있는 항목을 참조하고 requ.query는 '?'와 관련된 항목을 참조합니다.

예:

GET /something?color1=red&color2=blue

그 다음에 핸들러는 다음과 같이 표현합니다.

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

경로의 쿼리 문자열 매개 변수 값을 가져오려면 require.query를 사용합니다.requ.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);
});

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

단일 라우팅 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

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


귀하의 답변이 선호되는 방법이지만, URL, 게시물 및 경로 매개 변수에 모두 액세스할 수 있다는 점을 지적하고 싶습니다.

당신의 경우:

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

익스프레스 가이드에서:

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

  • q.파라미터
  • req.본체
  • req.반드시 해야 할

이 가이드에는 다음 사항이 설명되어 있습니다.

각 개체의 입력을 실제로 수락하지 않는 한 명확성을 위해 req.body, req.params 및 requ.query에 직접 액세스하는 것이 좋습니다.

하지만 실제로 발견한 것은req.param()명확하게 하고 특정 유형의 리팩터링을 더 쉽게 합니다.

@Zugwait의 대답은 정확합니다. req.param()사용되지 않습니다.당신은 야합다니해를 사용해야 .req.params,req.query또는req.body.

하지만 좀 더 명확하게 하기 위해서입니다.

req.params경로 값만 입력됩니다.즉, 만약 당신이 다음과 같은 경로를 가지고 있다면./users/:id은 할수다있니에 할 수 .id어느 쪽이든req.params.id또는req.params['id'].

req.query그리고.req.body경로 내에 있는지 여부에 관계없이 모든 매개 변수가 채워집니다.물론 쿼리 문자열의 매개 변수는 다음에서 사용할 수 있습니다.req.query포스트 바디의 매개 변수는 다음에서 사용할 수 있습니다.req.body.

그래서, 당신의 질문에 대답합니다.color경로에 없습니다. 사용하여 얻을 수 있어야 합니다.req.query.color또는req.query['color'].

QueryString에 액세스하려면 require.query를 사용해야 한다고 고속 설명서에 나와 있습니다.

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

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

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

간단히 사용할 수 있습니다.req.query쿼리 매개 변수를 잊습니다.

app.get('/', (req, res) => {
    let color1 = req.query.color1
    let color2 = req.query.color2
})

urlmodule은 URL 확인 및 구문 분석을 위한 유틸리티를 제공합니다.Express를 사용하지 않는 URL 구문 분석:

const url = require('url');
const queryString = require('querystring');

let rawUrl = 'https://stackoverflow.com/?page=2&size=3';

let parsedUrl = url.parse(rawUrl);
let parse = queryString.parse(parsedUrl.query);

// parse = { page: '2', size: '3' }

다른 방법:

const url = require('url');

app.get('/', (req, res) => {
  const queryObject = url.parse(req.url,true).query;
});

url.parse(req.url,true).query돌아온다{ color1: 'red', color2: 'green' }.
url.parse(req.url,true).host돌아온다'localhost:8080'.
url.parse(req.url,true).search'?color1=red&color2=green'을 반환합니다.

사용하기만 하면 됩니다.app.get:

app.get('/some/page/here', (req, res) => {
    console.log(req.query.color) // Your color value will be displayed
})

expressjs.com 설명서 api에서 확인할 수 있습니다. http://expressjs.com/en/api.html

제가 익스프레스에 있는 일부 앱에서 사용하기 시작한 좋은 기술은 익스프레스의 요청 객체의 쿼리, 매개 변수 및 본문 필드를 병합하는 객체를 만드는 것입니다.

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

언급URL : https://stackoverflow.com/questions/17007997/how-to-access-the-get-parameters-after-in-express