2017-09-02 57 views
0

我正在写一个小型服务器与快递,mongo和猫鼬。我的代码:猫鼬空白查询找到所有,但具体的查询失败

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

当我尝试使用mac: /req.query.mac/找到设备,它失败EVERY时间。如果我将它留空,它确实会返回设备(我添加了重复项以检查注释掉的代码)。

我已经试过看documentationstack overflow

+0

尽管答案可能会匹配,但我确实认为我的职位上的人甚至不知道如何开始提问。 –

回答

1

/.../记号不展开变量纳入他们的价值观,所以你字面上搜索的字符串req.query.mac(虽然.将匹配任何字符)。

你需要创建一个变量的值,你可以不使用RegExp constructor正则表达式的实例:

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

(以及类似的Device.count()

它建议使用像escape-string-regexp模块如果它是外部输入(req.query.mac可能包含在正则表达式模式中具有特殊含义的字符,并且某些模式可能被滥用以导致拒绝服务攻击),请首先正确地转义字符串:

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

谢谢,我从来没有想过那个:( –