[英]Returning undefined object when doing a query
我正在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
}
问题出在getCategory()函数中,当我在app.js(我的这个项目node.js的主文件)中调用它时,它只返回undefined。 我知道变量类别已填写,因为我插入了console.log (categories);
得到以下结果:
[ { _id: 5c7ea6fb91526418ec3ba2fd,
name: 'UNHAS',
slug: 'unhas',
__v: 0 } ]
app.js
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");
});
每当我的app.js收到变量类别时,它就会以未定义的形式到达。
有人能帮我吗?
您没有正确使用快速路由器中getCategory()
返回的Promise
对象:
app.get('/', (req, res) => {
var categories = configDB.getCategory(); <-- this is a Promise, not a synchronous value
res.render('home', categories);
});
相反,您可以使用async/await
来帮助弥合当前同步代码与基于Promise
的异步数据库接口之间的差距:
app.get('/', async (req, res) => {
var categories = await configDB.getCategory();
res.render('home', categories);
});
受@jakemingolla建议async-await的响应的启发,我开始使用回调来返回'categories'对象,一切都运行得很好。
函数在我的文件dbconfig.js中
const getCategoryList = (callback) => {
CategoryRef.find().then((categories) => {
callback(categories);
})
}
在我的app.js文件中调用该函数
app.get('/', (req, res) => {
database.getCategoryHomeList((categories) => {
res.render('home', {categories: categories});
})
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.