我用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;
使用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;
你真的不需要使用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')
}
})