来自URL的Nodejs查询不起作用

时间:2018-03-01 17:44:16

标签: javascript node.js

我有一个像这样声明的JS数组:

var phones = [
    {name: "Redmi Note 5" , manufacturer: "Redmi" , price: 9999},
    ...
];

我使用以下代码收听此服务器:

app.listen(9999, function (err) {
    if (err) {
    throw err
    }
    console.log('Server started on port 9999');
})

这是我正在使用的功能:

app.get('/get-items' , function(req , res) {
    var resu = phones;
    var man = (req.query['manufacturer'] === '');
    var mod = (req.query['name'] === '');
    console.log(man);
    console.log(mod);
    if (man)
        sortman(req , resu);
    if (mod)
        sortmod(req , resu);
    var jsonResult = JSON.stringify(resu);
    res.set('Content-Type', 'application/json');
    res.send(jsonResult);
})

如果我提供类似http://localhost:9999/get-items?manufacturer=Samsung的网址,我会将日志都视为错误,即使我没有提供任何参数,这两个日志仍会显示为错误。

我想知道我确实应该使用req.query['name']还是应该使用别的东西?

编辑:我使用require()

声明了所需的依赖项

3 个答案:

答案 0 :(得分:1)

那是因为:

req.query['manufacturer'] is equal to 'Samsung' and 
req.query['name'] is equal to undefined.

undefined and '' (empty string) are two different things in javascript. And they are not equal.

如果要检查所有这些,请使用lodash

中的isEmpty()
var _ = require('lodash')
app.get('/get-items' , function(req , res) {
    var resu = phones;
    if (_.isEmpty(req.query['manufacturer']))
        sortman(req , resu);
    if (_.isEmpty(req.query['name']))
        sortmod(req , resu);
    var jsonResult = JSON.stringify(resu);
    res.set('Content-Type', 'application/json');
    res.send(jsonResult);
})

isEmpty(val)将返回true,如果val是以下任何一个: [空对象,空字符串,空数组,空,未定义]

答案 1 :(得分:1)

您可能希望将制造商和名称分配给变量modman

app.get('/get-items' , function(req , res) {
    var resu = phones;
    var man = !!req.query['manufacturer'];
    var mod = !!req.query['name'];
    console.log(man);
    console.log(mod);
    if (man)
        sortman(req , resu);
    if (mod)
        sortmod(req , resu);
    var jsonResult = JSON.stringify(resu);
    res.set('Content-Type', 'application/json');
    res.send(jsonResult);
})

然后当您使用?manufacturer=Samsung进行通话时,您将在日志Samsung中调用排序函数。

编辑:您可以将任何内容强制转换为布尔值,双重感叹号!!req.query['manufacturer']将始终返回true / false,具体取决于您是否已提供它。

您可以在此处详细了解运营商:What is the !! (not not) operator in JavaScript?

答案 2 :(得分:1)

试试这个,如果您将任何值传递给制造商或名称。它会检查一个空字符串并且未定义。

app.get('/get-items', function (req, res) {
    var resu = phones;
    if (req.query.manufacturer) // ?manufacturer=Samsung
        sortman(req, resu);
    if (req.query.name)    // ?name=xyz
        sortmod(req, resu);
    var jsonResult = JSON.stringify(resu);
    res.set('Content-Type', 'application/json');
    res.send(jsonResult);
})