2017-09-02 3 views
0

J'écris un petit serveur avec express, mongo et mongoose. Mon code:Mongoose Blank Query trouve tout, mais une requête spécifique échoue

const express = require('express'); 
    const MongoClient = require('mongodb').MongoClient 
    const mongoose = require('mongoose'); 

    const COLOURS = ["e6194b", "3cb44b", "ffe119", "0082c8", "f58231", "911eb4", "46f0f0", "d2f53c", "fabebe", "e6beff"]; 

    var url = 'mongodb://localhost:27017/test'; 
    mongoose.connect(url); 

    var app = express(); 

    var db = mongoose.connection; 
    db.on('error', console.error.bind(console, 'connection error:')); 
    db.once('open', function() { 
     console.log('Database connected and open'); 
    }); 

    var deviceSchema = mongoose.Schema({ 
     mac: String, 
     ip: String, 
     colourIndex: Number 
    }); 
    var Device = mongoose.model('Device', deviceSchema); 

    app.get('/register', function (req, res) { 
     console.log("Registration: "); 
     console.log(" MAC: " + req.query.mac); 
     console.log(" IP : " + req.query.ip); 
     Device.find({ mac: /req.query.mac/ }, function(err, deviceList) { 
      if (err || deviceList.length == 0) { 
       console.log(" Cannot find " + req.query.mac + ": " + err); 
       Device.count({ mac: /req.query.mac/ }, function(err, count){ 
        var index = count; 
        console.log("There are " + count + " matching"); 
        var device = new Device({ mac: req.query.mac, ip: req.query.ip, colourIndex: index }); 
//     device.save(function (err, device) { 
//      if (err) { 
//       res.status(500).send("Internal error"); 
//       return console.error(err); 
//      } 
//      res.status(202).send(COLOURS[index]); 
//     }); 
        res.status(202).send(COLOURS[0]); 
       }); 
      } else { 
       console.log(deviceList); 
       res.status(202).send("Success");  
       console.log(" Colour index: %s", deviceList[0].colourIndex); 
      } 
     }); 
    }); 

Lorsque je tente d'utiliser mac: /req.query.mac/ pour trouver l'appareil, il échoue CHAQUE temps. Si je le laisse vide, il renvoie les périphériques (j'ai ajouté des doublons pour vérifier avec le code commenté).

J'ai essayé de regarder le documentation et stack overflow

+0

Bien que la réponse puisse correspondre, je pense que les gens dans ma position ne sauront même pas comment commencer à poser la question. –

Répondre

1

La notation /.../ ne se développe pas des variables dans leurs valeurs, alors vous êtes littéralement la recherche de la chaîne req.query.mac (bien que . correspond à tout caractère).

Vous devez créer une instance d'expression régulière de la valeur de la variable, vous pouvez faire en utilisant la RegExp constructor:

Device.find({ mac: new RegExp(req.query.mac) }, ...) 

(et de même pour Device.count())

Il est conseillé d'utiliser un module comme escape-string-regexp pour échapper correctement la chaîne en premier, étant donné que c'est une entrée externe (req.query.mac peut contenir des caractères qui ont une signification spéciale dans les modèles d'expression régulière, et certains modèles peuvent être abusés pour provoquer une attaque de déni de service):

const escapeStringRegexp = require('escape-string-regexp'); 
... 
Device.find({ mac: new RegExp(escapeStringRegexp(req.query.mac)) }, ...) 
+0

Merci, je n'aurais jamais compris ça :( –