Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 执行查询时返回未定义的对象_Javascript_Node.js_Mongoose - Fatal编程技术网

Javascript 执行查询时返回未定义的对象

Javascript 执行查询时返回未定义的对象,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我正在Node.js上构建一个应用程序,通过mongoose与MongoDB一起工作。连接是完美的,我可以添加新的文件,问题绝对不是在连接 我正在一个单独的.js文件中构建所有与mongoose一起工作的函数,我从dbconfig.js调用了这个文件 dbconfig.js const mongoose = require('mongoose'); // Models const User = require('./models/User'); const Category = require

我正在Node.js上构建一个应用程序,通过mongoose与MongoDB一起工作。连接是完美的,我可以添加新的文件,问题绝对不是在连接

我正在一个单独的.js文件中构建所有与mongoose一起工作的函数,我从dbconfig.js调用了这个文件

dbconfig.js

const mongoose = require('mongoose');

// Models
const User = require('./models/User');
const Category = require('./models/Category');

var database_name = "htm";
mongoose.Promise = global.Promise;

// Connection with database_name
var connect = () => {
    mongoose.connect("mongodb://localhost/"+database_name, {useNewUrlParser: true}).then(() =>{
        console.log("Conectado ao database: " + database_name);
    }).catch((erro) => {
        console.log("Erro ao se conectar ao database: " + database_name +" - "+ erro);
    });

    mongoose.model('users', User);
    mongoose.model('categories', Category);
}

var getCategory = () => {
    const Ref = mongoose.model('categories');
    Ref.find().then((categories) => {
        return categories;
    })
}

module.exports = {
    connect: connect,
    getCategory: getCategory
}
const express = require('express');
const app = express();
const categoriesRouter = require('./routes/categories');
const handlebars = require('express-handlebars');
const path = require('path');
const configDB = require('./dbconfig')

// Config
    // Template Engine
        app.engine('handlebars', handlebars({defaultLayout: 'main'}));
        app.set('view engine', 'handlebars');

    // Start Database Connection
        configDB.connect();

    // Public
        app.use(express.static(path.join(__dirname, "public")));

// Routes
    app.use('/categorias', categoriesRouter);

    app.get('/', (req, res) => {
        var categories = configDB.getCategory();

        res.render('home', categories);

    });

app.listen(3001, () =>{
    console.log("Servidor iniciado na porta 3001");
});
问题在于getCategory()函数,当我在我的app.js(这个项目节点的主文件)中调用它时,它只返回未定义的。我知道变量类别是填写的,因为我插入了
console.log(categories)
并得到以下结果:

[ { _id: 5c7ea6fb91526418ec3ba2fd,
    name: 'UNHAS',
    slug: 'unhas',
    __v: 0 } ]
app.js

const mongoose = require('mongoose');

// Models
const User = require('./models/User');
const Category = require('./models/Category');

var database_name = "htm";
mongoose.Promise = global.Promise;

// Connection with database_name
var connect = () => {
    mongoose.connect("mongodb://localhost/"+database_name, {useNewUrlParser: true}).then(() =>{
        console.log("Conectado ao database: " + database_name);
    }).catch((erro) => {
        console.log("Erro ao se conectar ao database: " + database_name +" - "+ erro);
    });

    mongoose.model('users', User);
    mongoose.model('categories', Category);
}

var getCategory = () => {
    const Ref = mongoose.model('categories');
    Ref.find().then((categories) => {
        return categories;
    })
}

module.exports = {
    connect: connect,
    getCategory: getCategory
}
const express = require('express');
const app = express();
const categoriesRouter = require('./routes/categories');
const handlebars = require('express-handlebars');
const path = require('path');
const configDB = require('./dbconfig')

// Config
    // Template Engine
        app.engine('handlebars', handlebars({defaultLayout: 'main'}));
        app.set('view engine', 'handlebars');

    // Start Database Connection
        configDB.connect();

    // Public
        app.use(express.static(path.join(__dirname, "public")));

// Routes
    app.use('/categorias', categoriesRouter);

    app.get('/', (req, res) => {
        var categories = configDB.getCategory();

        res.render('home', categories);

    });

app.listen(3001, () =>{
    console.log("Servidor iniciado na porta 3001");
});
无论何时在my app.js中收到变量类别,它都以未定义的形式到达


有人能帮我吗?

您在express路由器中没有正确使用从
getCategory()
返回的
Promise
对象:

    app.get('/', (req, res) => {
        var categories = configDB.getCategory(); <-- this is a Promise, not a synchronous value
        res.render('home', categories);
    });

受到@jakemingolla建议使用asyncwait的回复的启发,我开始使用callback返回“categories”对象,一切都很顺利

函数在我的文件dbconfig.js中

const getCategoryList = (callback) => {
    CategoryRef.find().then((categories) => {
        callback(categories);
    })
}
调用my app.js文件中的函数

app.get('/', (req, res) => {
    database.getCategoryHomeList((categories) => {
        res.render('home', {categories: categories});
    })
});

这对我来说不起作用,但它激励我带着承诺工作并解决问题