实现node.js回电以获取结果



我是node.js中的完整初学者,所以请原谅我,如果我的问题是愚蠢的。要获得所需的输出。

代码:

MongoClient.connect(url,function(err,db){
               if(err) throw err;
            var list=()=>{
                var arr=[]
                var blQ={blocked_user:data.tag_search_mail} 
                 db.collection("block_list").find(blQ,{"_id":0}).toArray((err,res)=>{
                         for(let i=0;i<res.length;i++){
                             arr.push(res[i]["blocker"])
                         }
                   });  
                 return arr  
            }
            var showList=(callback)=>{
               callback()
            }
            console.log(showList(list))//It's giving undefined
          // I wonder how can I print the returned array

我在建议之后尝试的内容:

var list = (callback) => {
                var arr=[]
                    var blQ={blocked_user:data.tag_search_mail} 
                      db.collection("block_list").find(blQ,{"_id":0}).toArray((err,res)=>{
                              for(let i=0;i<res.length;i++){
                                  arr.push(res[i]["blocker"])
                              }
                              callback(arr);    
                        });  
            }
            list((arr) => {
                console.log(arr);
            })

而不是手动回调,我建议您使用node.js本机界面中内置的Promise接口。

如果您想将其放入功能中并将结果传达并在完成后关闭DB,则可以执行以下操作并从函数中返回呼叫的承诺。

function getBlocked(data) {
    let openDb;
    close() {
        if (openDb) {
            openDb.close().catch(err => {
                console.log("Error closing db: ", err);
            })
        }
    }
    return MongoClient.connect(url).then(db => {
        openDb = db;
        const blQ = {blocked_user:data.tag_search_mail};
        return db.collection("block_list").find(blQ,{"_id":0}).toArray();
    }).then(results => {
        let blocked = results.map(item => item.blocker);
        close();
        return blocked;     // make this the resolved value of the promise
    }).catch(err => {
        close();
        throw err;          // rethrow to keep the promise rejected
    })
}
// usage
getBlocked(data).then(blocked => {
    // use blocked array here
}).catch(err => {
    // handle error here
});

我建议使用Mongoose,该节点模块与MongoDB平稳接口。如果您是兴趣,则是文档:http://mongoosejs.com/

但是,要回答您的问题...

当前代码的问题是showList函数实际上没有返回任何内容。这是您想要的:

var list = (callback) => {
    // query mongodb here
    callback(arr);
}
list((arr) => {
    console.log(arr);
});

list接收一个函数,最终在该函数完成后调用该函数。查询mongoDB。它将通过arr对象传递。因此,当您稍后调用list时,您将传递一个函数,该函数接收arr对象,然后致电console.log(arr)以打印结果。祝你好运!

var list =() => {
let arr =[];
for(let a =0 ; a< 20; a++)
arr.push(a);
return arr;
}
var show = (callback) => {
return callback()}
console.log("123",show(list));

输出::123(20([0,1,2,3,4,5,6,6,7,7,8,9,11,11,11,12,12,13,14,14,15,1516、17、18、19]

尝试在调用回调函数之前添加返回语句,然后将列表函数的返回语句添加到数据库块中。这可能会解决您的问题。

MongoClient.connect(url,function(err,db){
           if(err) throw err;
        var list=(done)=>{
            var arr=[]
            var blQ={blocked_user:data.tag_search_mail} 
             db.collection("block_list").find(blQ,{"_id":0}).toArray((err,res)=>{
                     for(let i=0;i<res.length;i++){
                         arr.push(res[i]["blocker"])
                     }
                if(err) done(err);
                else done(null,arr);
               });  
        }
        var showList=(callback)=>{
           callback((err, result) => {
            if(err) console.log(err);
            else console.log(result):
})
        }
        showList(list);

最新更新