Skip to content
techird edited this page Apr 6, 2016 · 1 revision

Step4. 列出所有上传的文件记录

上一步:Step3. 把文件访问信息存储到 MongoDB 中

本步骤完整源码在 workflow/step-4 分支上,提交记录为 e4e35e8

现在用户每上传一张图片,就会上传到 COS 服务器并且在 MongoDB 以文档的形式保存起来。接下来,我们做一个接口,列出所有用户上传的文件。

首先,在 server.js 添加一个路由处理。

// server.js
app.use("/list", require("./handle/list"));

紧接着,我们创建 handle/list.js 来处理这个路由。

// handle/list.js
'use strict';

const async = require("co");
const printer = require("../lib/printer");
const mongo = require("../lib/mongo");

const list = (request, response) => async (function * () {
    const print = printer(request, response);
    const params = request.query;
    
    let db;
    
    try {
        db = yield mongo.connect();
    } catch (mongoError) {
        print(mongoError);
        return;
    }
    
    try {
        const imageCollection = db.collection("images");
        let query = imageCollection.find();
        const list = yield query.toArray();
        print({ list });
    } catch (error) {
        console.log(error);
        print({ error });
    } finally {
        db.close();
    }
});

module.exports = list;

上述代码使用 db.collection("images").find() 方法得到了图片文档集合的游标,然后再调用 toArray() 方法将文档列出到数组。使用 Postman 执行 /list 请求后,可以收到如下响应。

{
  "list": [
    {
      "_id": "5702287c425194b13df1cacf",
      "name": "qq.png",
      "size": 59482,
      "mime": "image/png",
      "url": "http://image-10028115.file.myqcloud.com/uploads/1ec90386994e371b1f51809be59324a9.png",
      "cos": {
        "access_url": "http://image-10028115.file.myqcloud.com/uploads/1ec90386994e371b1f51809be59324a9.png",
        "resource_path": "/uploads/1ec90386994e371b1f51809be59324a9.png",
        "source_url": "http://image-10028115.cos.myqcloud.com/uploads/1ec90386994e371b1f51809be59324a9.png",
        "url": "http://web.file.myqcloud.com/files/v1/uploads/1ec90386994e371b1f51809be59324a9.png"
      },
      "meta": {}
    }
  ]
}

列出所有记录

注意到上述代码使用了 ES2015 Generator + Promise 来处理异步代码,会比写 callback 的形式优雅很多。简单介绍就是 ES2015 的 Generator 可以使函数执行到特定的位置「暂停」( yield 关键字上),等到合适的时候再「重启」(generator.next())。

利用这个特性,可以编写一个 Runtime,让代码在 yield 一个 Promise 的时候暂停,又在 Promise onfulfill 的时候继续。这样代码看起来就像是执行到一半的时候在「等待」一个数据或者响应。在这个项目中,选用了 co 作为 Generator Promise Runtime。

Node 4.x 的版本已经支持 Generator,所以在 Node 环境下,可以大胆使用这些新特性。

更多资料,可以参考这篇文章

下一步:Step5. 支持图片元数据更新