如何在NodeJS / ExpressJS

时间:2017-01-06 01:36:45

标签: node.js mongodb api express bluebird

我是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。

我不确定是什么,

  • 如果这是从我的模型将数据返回到路由回调函数的正确方法?
  • 效率这么高吗?
  • 使用promisifyAll很慢?因为它循环遍历模块中的所有函数,并使用Async作为后缀创建函数的副本,现在返回一个promise。它什么时候实际运行?这是与节点需求语句相关的更通用的问题。见下一点。
  • 什么时候需要语句运行?当我启动nodejs服务器?或者当我打电话给api?

1 个答案:

答案 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); }); }); }); } 会返回一个承诺,您可以将getAllJobsthen处理程序链接到。例如:

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处理程序。你很高兴你做到了!