Node.js: Unterschied zwischen req.query [] und req.params

123

Gibt es einen Unterschied zwischen dem Abrufen von QUERY_STRING-Argumenten über req.query[myParam]und req.params.myParam? Wenn ja, wann soll ich welche verwenden?

Pavindu
quelle

Antworten:

141

req.paramsenthält Routenparameter (im Pfadbereich der URL) und req.queryenthält die URL-Abfrageparameter (nach dem ?in der URL).

Sie können auch req.param(name)einen Parameter an beiden Stellen (sowie req.body) nachschlagen , aber diese Methode ist jetzt veraltet.

JohnnyHK
quelle
Ah, ok, danke, beide werden von Express bereitgestellt. Und POST-Daten, auf die ich über req.body.myParam zugreife?
1
Richtig. Welche Sie verwenden möchten, hängt davon ab, was Sie tun möchten.
JohnnyHK
Beachten Sie außerdem: "Der direkte Zugriff auf req.body, req.params und req.query sollte aus Gründen der Übersichtlichkeit bevorzugt werden - es sei denn, Sie akzeptieren wirklich Eingaben von jedem Objekt." - Express-Dokumentation
Ryan Q
2
req.paramist jetzt veraltet. Knoten schlägt vor, mit req.queryoderreq.params
SaiyanGirl
3
warum es ablehnen? Was ist, wenn wir Parameter oder Abfragen verwenden und dann entscheiden, sie in eine andere zu ändern?
John
246

Angesichts dieser Route

app.get('/hi/:param1', function(req,res){} );

und diese URL gegeben http://www.google.com/hi/there?qs1=you&qs2=tube

Du wirst haben:

req. Abfrage

{
  qs1: 'you',
  qs2: 'tube'
}

req. params

{
  param1: 'there'
}

Express req.params >>

Ruffrey
quelle
Was ist, wenn ich / hi / bekommen muss?
Daniel
2
Werfen Sie einen Blick auf req.url oder req.originalUrl oder req._originalUrl und teilen Sie sich dann am/
ruffrey
22

Angenommen, Sie haben Ihren Routennamen folgendermaßen definiert:

https://localhost:3000/user/:userid

was wird werden:

https://localhost:3000/user/5896544

Hier, wenn Sie drucken möchten : request.params

{
userId : 5896544
}

so

request.params.userId = 5896544

also request.params ist eine Objekteigenschaften auf die benannte Route enthält

und request.query stammt aus Abfrageparametern in der URL, z.

https://localhost:3000/user?userId=5896544 

request.query

{

userId: 5896544

}

so

request.query.userId = 5896544
Deeksha Sharma
quelle
Gute Erklärung
Abk
7

Sie sollten jetzt mit der Punktnotation auf die Abfrage zugreifen können.

Wenn Sie darauf zugreifen möchten, sagen Sie, dass Sie eine GET- Anfrage unter erhalten /checkEmail?type=email&utm_source=xxxx&email=xxxxx&utm_campaign=XXund die verwendete Abfrage abrufen möchten .

var type = req.query.type,
    email = req.query.email,
    utm = {
     source: req.query.utm_source,
     campaign: req.query.utm_campaign
    };

Parameter werden für den selbst definierten Parameter zum Empfangen von Anforderungen verwendet, wie z. B. (Beispiel):

router.get('/:userID/food/edit/:foodID', function(req, res){
 //sample GET request at '/xavg234/food/edit/jb3552'

 var userToFind = req.params.userID;//gets xavg234
 var foodToSearch = req.params.foodID;//gets jb3552
 User.findOne({'userid':userToFind}) //dummy code
     .then(function(user){...})
     .catch(function(err){console.log(err)});
});
Animesh Singh
quelle
0

Ich möchte einen wichtigen Hinweis dazu erwähnen req.query, da ich derzeit an Paginierungsfunktionen arbeite, die auf basierenreq.query und ich habe ein interessantes Beispiel, das ich Ihnen demonstrieren kann ...

Beispiel:

// Fetching patients from the database
exports.getPatients = (req, res, next) => {

const pageSize = +req.query.pageSize;
const currentPage = +req.query.currentPage;

const patientQuery = Patient.find();
let fetchedPatients;

// If pageSize and currentPage are not undefined (if they are both set and contain valid values)
if(pageSize && currentPage) {
    /**
     * Construct two different queries 
     * - Fetch all patients 
     * - Adjusted one to only fetch a selected slice of patients for a given page
     */
    patientQuery
        /**
         * This means I will not retrieve all patients I find, but I will skip the first "n" patients
         * For example, if I am on page 2, then I want to skip all patients that were displayed on page 1,
         * 
         * Another example: if I am displaying 7 patients per page , I want to skip 7 items because I am on page 2,
         * so I want to skip (7 * (2 - 1)) => 7 items
         */
        .skip(pageSize * (currentPage - 1))

        /**
         * Narrow dont the amound documents I retreive for the current page
         * Limits the amount of returned documents
         * 
         * For example: If I got 7 items per page, then I want to limit the query to only
         * return 7 items. 
         */
        .limit(pageSize);
}
patientQuery.then(documents => {
    res.status(200).json({
        message: 'Patients fetched successfully',
        patients: documents
    });
  });
};

Sie werden ein +Schild vor req.query.pageSizeund bemerkenreq.query.currentPage

Warum? Wenn Sie +in diesem Fall löschen , wird ein Fehler angezeigt, und dieser Fehler wird ausgelöst, da ein ungültiger Typ verwendet wird (mit der Fehlermeldung muss das Feld 'limit' numerisch sein).

Wichtig : Wenn Sie etwas aus diesen Abfrageparametern extrahieren, handelt es sich standardmäßig immer um eine Zeichenfolge , da die URL kommt und als Text behandelt wird.

Wenn wir mit Zahlen arbeiten und Abfrageanweisungen von Text in Zahlen konvertieren müssen, können wir einfach ein Pluszeichen vor der Anweisung einfügen.

Meile Mijatović
quelle