我是nodejs / expressjs和mongodb的新手。我正在尝试创建一个API,将数据暴露给我试图使用Ionic框架构建的移动应用程序。
我有这样的路线设置
router.get('/api/jobs', (req, res) => {
JobModel.getAllJobsAsync().then((jobs) => res.json(jobs)); //IS THIS THe CORRECT WAY?
});
我的模型中有一个从Mongodb读取数据的函数。我正在使用Bluebird promise库来转换我的模型函数以返回promises。
const JobModel = Promise.promisifyAll(require('../models/Job'));
我在模型中的功能
static getAllJobs(cb) {
MongoClient.connectAsync(utils.getConnectionString()).then((db) => {
const jobs = db.collection('jobs');
jobs.find().toArray((err, jobs) => {
if(err) {
return cb(err);
}
return cb(null, jobs);
});
});
}
promisifyAll(myModule)将此函数转换为返回一个promise。
我不确定是什么,
答案 0 :(得分:0)
您的基本结构或多或少是正确的,尽管您对Promise.promisifyAll
的使用对我来说似乎很尴尬。对我来说基本问题(并且它不是真正的问题 - 您的代码看起来会起作用)是您正在混合和匹配基于承诺和基于回调的异步代码。正如我所说,这应该仍然有效,但我宁愿尽可能地坚持下去。
如果您的模型类是您的代码(而不是其他人编写的某些库),您可以轻松地将其重写为直接使用promises,而不是将其编写为回调,然后使用{{1包装它。
以下是我接近Promise.promisifyAll
方法的方法:
getAllJobs
此版本的static getAllJobs() {
// connect to the Mongo server
return MongoClient.connectAsync(utils.getConnectionString())
// ...then do something with the collection
.then((db) => {
// get the collection of jobs
const jobs = db.collection('jobs');
// I'm not that familiar with Mongo - I'm going to assume that
// the call to `jobs.find().toArray()` is asynchronous and only
// available in the "callback flavored" form.
// returning a new Promise here (in the `then` block) allows you
// to add the results of the asynchronous call to the chain of
// `then` handlers. The promise will be resolved (or rejected)
// when the results of the `job().find().toArray()` method are
// known
return new Promise((resolve, reject) => {
jobs.find().toArray((err, jobs) => {
if(err) {
reject(err);
}
resolve(jobs);
});
});
});
}
会返回一个承诺,您可以将getAllJobs
和then
处理程序链接到。例如:
catch
不可否认,这与您上面的代码非常相似。唯一的区别是我放弃了JobModel.getAllJobs()
.then((jobs) => {
// this is the object passed into the `resolve` call in the callback
// above. Do something interesting with it, like
res.json(jobs);
})
.catch((err) => {
// this is the error passed into the call to `reject` above
});
的使用 - 如果你自己编写代码&你想使用承诺,然后自己动手。
一个重要的注意事项:包含Promise.promisifyAll
处理程序是一个好主意。如果你没有,你的错误将被吞没并消失,你将不知道为什么你的代码不起作用。即使您不认为自己需要它,也只需编写一个将其转储到catch
的catch处理程序。你很高兴你做到了!