NodeJ仅返回第一个文档

时间:2018-10-16 12:00:17

标签: javascript node.js

我正在使用NodeJs和MongoDb作为后端服务。在我的收藏集中,我有几个文档包含名为_id和Name的字段,但是Node仅返回第一个文档并在控制台中显示错误。我想仅获取其中的Name字段一个文件。

错误:

Error

这是我的代码:

var express = require('express');    
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
var bodyParser = require('body-parser');

var app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true})); 

app.post('/offers',(req, res) => {

 MongoClient.connect(url, (err, db) => {           
    if(err) throw err;
    var dbo = db.db('Tiffino_db');

    dbo.collection("Offers")
        .find({},{ projection: { _id: 0 } })
        .toArray((err, result) => {
             if (err) {
                     console.log("Error:", +err);
                 }
                 else { 
                    for(var i = 0;i<result.length;i++){
                      res.send(result[i].Name);
                    }
                   db.close();
                }
           });
     });
});

请让我知道我在上面的代码中做错了什么。

谢谢

6 个答案:

答案 0 :(得分:1)

您似乎正在尝试使用Response.Send()循环发送多个响应,因为响应仅发送一次。 这将行不通,您需要创建一个名称数组,然后使用Response.Send()进行一次。

使用res.send(result.map(r => r.name))可能会起作用

答案 1 :(得分:1)

您应该将结果聚合到一个变量中,然后只调用一次res.send():

let resultString;
for(var i = 0;i<result.length;i++){
   resultString += result[i].Name + '\n';
}
res.send(resultString);

如果要流式传输结果,则可以使用res.write(),并在完成后调用res.end()

答案 2 :(得分:1)

...
...
else { 
    output = result.map(offer => offer.name);
    res.send({output});
    db.close();
}

这应该起作用,因为您只能在单个response对象上发送一次响应,而您调用该对象的时间为results.length次。

答案 3 :(得分:1)

您不能在for循环中多次使用res.send(),请尝试这样的操作

var data=[];
for(var i = 0;i<result.length;i++){
                  data.push(result[i].Name);
                }
res.send(data);

答案 4 :(得分:1)

li

答案 5 :(得分:0)

我很确定您不应该多次致电def draw_grid(n): for i in range(n): for j in range(1, n + 1): print(j, end=' ') print() draw_grid(3) 。由于您是在循环中调用它,因此它将发送第一个文档,而在下一个文档中按预期失败。