为什么我没有在第一次调用REST API时获取数据

时间:2017-04-07 10:27:16

标签: node.js rest

我正在调用我的REST API,但在第一次调用时返回一个空数组,在第二次调用时只返回所需的结果。这是我的文件。

用于连接mongodb数据库的mongodb.js

var MongoClient =require('mongodb').MongoClient;
var dburl = 'mongodb://localhost:27017/test';


module.exports.connect = function connect(callback){
    MongoClient.connect(dburl, function(err, conn){
        /* exports the connection */
        if(err)
        {
            callback(err);console.log(err)
        }
        else
        {
            callback(undefined,conn.collection('person'));
            //console.log(conn)
        }

    });
};

getUsers.js用于从数据库中检索文档

const mongodb = require('.././mongodb/mongodb');

var v=[];
module.exports.getUser=function(callback)
{
    mongodb.connect(function(err,db)
    {
        if (err)
        {
            console.log(err)
        }
        else
        {
            data(db,function (docs) {
                //console.log(v)
                callback(v)
            })
           // console.log(v)

        }
    });
}
function data(db,callback) {
    db.find().forEach((docs)=>{
                v.push(docs)
    })
    callback(v);
}

server.js用于启动服务器

const express = require('express');
const bodyparser = require('body-parser')
const getUsers = require('./users/getUsers');
const insertUsers = require('./users/insertUsers');
const findUsers = require('./users/findUsersEmail');
const delusers=require('./users/deleteUsers')
const moduser=require('./users/updateUser')
const app = express();
app.use(bodyparser.json())
app.get('/person', (req, res) =>
{   console.log(res.statusCode)
    if(res.statusCode==200)
    {
        getUsers.getUser(function (userList){
            res.json(userList);
            console.log(userList);

        })

    }})
app.listen(4569,()=>console.log('server has started on 4501'))

1 个答案:

答案 0 :(得分:0)

因为您的data函数在实际返回数据之前调用了回调。正确的实施应该是:

const mongodb = require('.././mongodb/mongodb');

module.exports.getUser = function(callback) {
  mongodb.connect(function(err, db) {
    if (err) {
      console.log(err);
    } else {
      data(db, callback);
    }
  });
}

function data(db, callback) {
  db.find().toArray((err, docs) => callback(docs));
}

您可以看到根本没有使用全局变量v

顺便说一下,您应该遵循NodeJS约定来实现回调函数:

callback(err[, ...args])

当您的代码库增长时,跳过错误参数会给您带来很多痛苦,尤其是当您需要与第三方库集成时。