如何等待 Mongoose 搜索的 return?
How to wait for the return of a Mongoose search?
我用 NodeJS / Mongoose 创建了一个 CRUD,以 MVC 风格拆分文件。在我下面显示的路由示例中,当执行 retrieveOne
例程时,有必要等待它的处理,然后将用户重定向到一个或另一个路由。我想用 Bluebird 等待处理。我需要一些帮助来实施例程。
Index.js -------------------------------------- ------
const myCRUD = require('./api/controllers/controller')
router.post('/login', function(req, res, next) {
// HOW TO IMPLEMENT BLUEBIRD HERE?
// How to wait for the "retrieveOne" process and a then do a "if" test (below)?
let ret = myCRUD.retrieveOne({ name: "abc test" });
if(!ret) {
res.redirect('/success')
} else {
res.redirect('/error')
}
})
controller.js -------------------------------------- --
const mongoose = require('mongoose');
const Schema = require('./schema-user');
const Model = mongoose.model('users', Schema);
const CRUD = {
retrieveOne: function(query) {
Model.findOne(query, function(err, result) {
if (err) return err;
return result;
});
}
}
module.exports = CRUD;
注意:我已经在 S.O 中找到了几个使用和不使用 Bluebird 的示例,但我无法让它工作:
示例:, 2, , , 5
你真的不需要为此使用 Bluebird,因为 mongoose 与原生 Promises 一起工作得很好
在你的控制器中:
const mongoose = require('mongoose');
const Schema = require('./schema-user');
const Model = mongoose.model('users', Schema);
const CRUD = {
retrieveOne: function(query) {
// findOne() returns a Promise ()
// https://mongoosejs.com/docs/promises.html
return Model.findOne(query);
}
}
module.exports = CRUD;
现在,您可以让您的路由处理程序成为一个 async
函数,而只是 await
Promise
const myCRUD = require('./api/controllers/controller')
router.post('/login', async function(req, res, next) {
let ret = await myCRUD.retrieveOne({ name: "abc test"});
if(!ret) {
res.redirect('/success')
} else {
res.redirect('/error')
}
})
使用 async
和 await
const myCRUD = require('./api/controllers/controller')
const Promise = require('bluebird');
router.post('/login', async function(req, res, next) {
// HOW TO IMPLEMENT BLUEBIRD HERE?
// How to wait for the "retrieveOne" process and a then do a "if" test (below)?
let ret = await myCRUD.retrieveOne('{ name: "abc test"');
if(!ret) {
res.redirect('/success')
} else {
res.redirect('/error')
}
})
// controller.js ------------------------------------------
const mongoose = require('mongoose');
const Schema = require('./schema-user');
const Model = mongoose.model('users', Schema);
const CRUD = {
retrieveOne: function(query) {
return new Promise((resolve, reject) => {
Model.findOne(query, function(err, result) {
if (err) reject(err);
resolve(result);
});
});
}
}
module.exports = CRUD;
我用 NodeJS / Mongoose 创建了一个 CRUD,以 MVC 风格拆分文件。在我下面显示的路由示例中,当执行 retrieveOne
例程时,有必要等待它的处理,然后将用户重定向到一个或另一个路由。我想用 Bluebird 等待处理。我需要一些帮助来实施例程。
Index.js -------------------------------------- ------
const myCRUD = require('./api/controllers/controller')
router.post('/login', function(req, res, next) {
// HOW TO IMPLEMENT BLUEBIRD HERE?
// How to wait for the "retrieveOne" process and a then do a "if" test (below)?
let ret = myCRUD.retrieveOne({ name: "abc test" });
if(!ret) {
res.redirect('/success')
} else {
res.redirect('/error')
}
})
controller.js -------------------------------------- --
const mongoose = require('mongoose');
const Schema = require('./schema-user');
const Model = mongoose.model('users', Schema);
const CRUD = {
retrieveOne: function(query) {
Model.findOne(query, function(err, result) {
if (err) return err;
return result;
});
}
}
module.exports = CRUD;
注意:我已经在 S.O 中找到了几个使用和不使用 Bluebird 的示例,但我无法让它工作:
示例:
你真的不需要为此使用 Bluebird,因为 mongoose 与原生 Promises 一起工作得很好
在你的控制器中:
const mongoose = require('mongoose');
const Schema = require('./schema-user');
const Model = mongoose.model('users', Schema);
const CRUD = {
retrieveOne: function(query) {
// findOne() returns a Promise ()
// https://mongoosejs.com/docs/promises.html
return Model.findOne(query);
}
}
module.exports = CRUD;
现在,您可以让您的路由处理程序成为一个 async
函数,而只是 await
Promise
const myCRUD = require('./api/controllers/controller')
router.post('/login', async function(req, res, next) {
let ret = await myCRUD.retrieveOne({ name: "abc test"});
if(!ret) {
res.redirect('/success')
} else {
res.redirect('/error')
}
})
使用 async
和 await
const myCRUD = require('./api/controllers/controller')
const Promise = require('bluebird');
router.post('/login', async function(req, res, next) {
// HOW TO IMPLEMENT BLUEBIRD HERE?
// How to wait for the "retrieveOne" process and a then do a "if" test (below)?
let ret = await myCRUD.retrieveOne('{ name: "abc test"');
if(!ret) {
res.redirect('/success')
} else {
res.redirect('/error')
}
})
// controller.js ------------------------------------------
const mongoose = require('mongoose');
const Schema = require('./schema-user');
const Model = mongoose.model('users', Schema);
const CRUD = {
retrieveOne: function(query) {
return new Promise((resolve, reject) => {
Model.findOne(query, function(err, result) {
if (err) reject(err);
resolve(result);
});
});
}
}
module.exports = CRUD;