首先,请原谅我略带模糊的标题;我找不到更合适的一个:
方案
我使用Mongoose获取一些数据然后用ejs渲染它们。为了便于说明,请考虑以下事项:
// Schema
var UserSchema = mongoose.Schema({
Username: String,
City: String
})
// Model
var User = mongoose.model('User', UserSchema);
从我的服务器文件:
app.get('/view', function (req, res) {
// What I am trying to do
User.find({}).exec().then(vals=>{
res.send(vals)
})
问题
上面的代码按预期工作,但是,对于其他文件可访问的代码以及使升级更容易,我想将其移动到另一个文件,然后require()该文件。
handler.js
// Promise: Get All Names
function FetchData(){
return User
.find({})
.exec();
}
module.exports = {
Get: function(){
val = User.find({}).exec()
.then(vals=>{
// Expected to return only after the above is complete
return vals
})
}
}
然后,从我的服务器文件:
var handler = require('handler')
app.get('/view', function (req, res) {
res.send(handler.Get())
});
不幸的是,此代码无法按预期工作
我的想法
我改变了参数并调整了几次代码,但我无法弄清楚出了什么问题。 看来Get()的值甚至在使用promise之前就被返回了(这很令人费解)。
任何帮助都会受到欢迎:)
答案 0 :(得分:0)
我认为你应该是这样的:
module.exports = {
Get: function() {
return User.find({}).exec()
.then(vals => {
// Expected to return only after the above is complete
return vals
})
}
}
然后
app.get('/view', function (req, res) {
handler.Get().then((response) => {
res.send(response);
});
});
因此,请从Get
返回承诺,然后使用其then
API。
答案 1 :(得分:0)
以下是可能对您有所帮助的代码。
将主服务器文件更改为此类
app.get('/view', function (req, res) {
handler.Get().then(vals => {
res.send(vals);
});
在handler.js文件中,您可以执行
module.exports.Get = function(){
return new Promise((resolve, reject) => {
User.find({}).exec(function(err, users){
if(!err){
resolve(users);
}
});
});
}