我需要从koa上传一个文件到s3,我对koa非常陌生,可能遗漏了一些明显的东西。它实际上完成了200,但是这个文件从来没有出现在s3上。
下面是我的app.js中的一个片段:
'use strict';
var jwt = require('koa-jwt');
var bodyParser = require('koa-bodyparser');
var koaBody = require('koa-body');
const app = module.exports = require('koa')()
.use(koaBody({multipart:true})) // this is to pase only multipart forms
.use(require('./routes/common'))
.use(require('./routes/auth'))
.use(require('./routes/users_public'))
.use(jwt({ secret: SECRET }))
//protected routes below this line
.use(require('./routes/subcontractors_private'))
.listen(process.env.PORT || 3000);subcontractors_private.js看起来像这样:
'use strict';
var AWS = require('aws-sdk');
var fs = require('fs');
var zlib = require('zlib');
var S3_BUCKET = require('../consts').S3_BUCKET;
var S3_OPTIONS = require('../consts').S3_OPTIONS;
module.exports = require('koa-router')()
.post('/subcontractors/:subcontractor_id/coi', function *(next) {
var body = JSON.stringify(this.request.body, null, 2)
let subcontractor_id = this.params.subcontractor_id;
var file = this.request.body.files.coi.path;
var body = fs.createReadStream(file).pipe(zlib.createGzip());
var s3obj = new AWS.S3(
{params:
{
Bucket: 'coi-test',
Key: 'i/' + subcontractor_id + '.png.zgip'
}
});
s3obj.upload({Body: body})
.on('httpUploadProgress', function(evt) {
console.log(evt);
})
.send(function(err, data) {
console.log(err, data);
});
this.response.status = 200;
this.body = { "result": "subcontractor CIO successfully uploaded"};
})
.routes();最后,测试文件夹中的subcontractor_private.js片段:
'use strict';
const supertest = require('co-supertest'); // SuperAgent-driven library for testing HTTP servers
const expect = require('chai').expect; // BDD/TDD assertion library
require('co-mocha'); // enable support for generators in mocha tests using co
var uuid = require('uuid');
var db = require('../../consts').DB;
var moment = require('moment');
const app = require('../../app.js');
const request = supertest.agent(app.listen());
var assert = require('assert');
describe('/subcontractors private routes testing', function() {
it.only('should be able to upload COI for subcontractor', function*() {
const coi_expires_at = moment().add(1, 'd').format();
const response =
yield request.post('/subcontractors')
.set('Content-Type', 'application/json')
.set('Authorization', 'Bearer ' + token)
.send({name: "Joe Doh"})
.end();
//now try to upload the coi file
const response1 =
yield request.post('/subcontractors/' + response.body.subcontractor.id + "/coi")
.set('Authorization', 'Bearer ' + token)
.field('Content-Type', 'multipart/form-data')
.field('coi_expires_at', coi_expires_at)
.attach('coi', './assets/logo-big.png')
.end();
expect(response1.status).to.equal(200, response1.text);
expect(response1.body).to.be.an('object');
expect(response1.body).to.be.json;
expect(response1.body).to.contain.keys('result');
expect(response1.body.result).to.equal('subcontractor CIO successfully uploaded');
});
});我尝试将上传代码作为一个独立的js文件(通过node运行),它工作得很好。但是当我将它作为mocha测试中的节点应用程序运行时--该方法以response 200结束,并且永远不会完成上传。我做错了什么?
发布于 2016-05-20 12:57:54
问题在于这种东西的异步特性。测试在没有等待请求结束的情况下结束(甚至正常启动)。我不完全清楚如何正确操作,但添加以下内容:
it.only('should be able to upload COI for subcontractor', function*(done) {(完成回调参数)使测试等待调用“完成”回调,从而允许aws sdk完成请求。但是,我不确定如何修复您的测试,因为this是两次异步的。koa服务器中的控制器方法异步返回,等待S3请求完成,因此mocha测试无法等待S3处理完成。
(另请参阅我的相关问题:aws-sdk s3 upload not working from mocha test)
https://stackoverflow.com/questions/37241443
复制相似问题