-
Notifications
You must be signed in to change notification settings - Fork 1
Step4
techird edited this page Apr 6, 2016
·
1 revision
上一步: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. 支持图片元数据更新