4
回答
不知道是为什么出这种现象
注册华为云得mate10,2.9折抢先购!>>>   

@Arrowing 你好,想跟你请教个问题:

我在做上传消息的时候

exports.upload = function (req,res) {
    mongodbPool.acquire(function(err,db){
        if(err){
            return res.josn(400,{'err':'acquire db failed'});
        }
        var gridform = require('gridform');
        gridform.db = db;
        gridform.mongo = mongo;
        var form = gridform();
        form.parse(req, function (err, fields, files) {
            if(err){
                mongodbPool.release(db);
                return res.json(400,err);
            }  
            if(files.starVoiceMessage === undefined || fields.star_id === undefined){
                var grid = new Grid(db, 'fs');
                for(var key in files){
                    grid.delete(files[key].id, function(err, result){
                        if(err){
                            //the useless file data can not be delete, its id need to record in error log
                            uploadErrorLogfile.write('file need to delete: '+files[key].id);
                        }
                    });
                }
                mongodbPool.release(db);
                return res.json(400,{'err':'wrong format'});
            } 
程序能运行出正确的结果,但每一次第一次解析时files.starVoiceMessage 就为 undefined点第二次的时候就能正常解析,为什么出现这种情况?

举报
90后爱国
发帖于4年前 4回/264阅
共有4个答案 最后回答: 4年前

没用过gridform

你的语境里,files对象是根据前端传来的数据生成的吧,那starVoiceMessage是gridform生成的还是你自己设置的数据呢?

是不是第二次上传的时候,才取到第一次上传时starVoiceMessage的值?

files的对象是前端传过来的post解析出来的对象starVoiceMessage是前端的数据字典里的一项。

我现在也不太明白。

当连续的点击上传时第二次以后就好用,但隔一段时间在点击时又会出现第一次files.starVoiceMessage的值为undefined但files里有值。

--- 共有 2 条评论 ---
90后爱国回复 @Arrowing : 前端使用的是ios写的 4年前 回复
Arrowing可以发前端关于starVoiceMessage的代码看看? 4年前 回复
 NSBundle *mainBundle = [NSBundle mainBundle];
 NSString *filepath = [mainBundle pathForResource:@"JANE & JESSICA" ofType:@"mp3"];
 NSData *audioData = [NSData dataWithContentsOfFile:filepath];
    
    NSDictionary *parameters = @{@"starVoiceMessage":audioData,@"star_id":@"534bac37c264b3c481607434"};
    
    NSString *url = @" http://192.168.199.236:3000/upload";
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
    [request setHTTPMethod:@"POST"];
    [SRMultipartDataSend addMultipartDataWithParameters:parameters toURLRequest:request];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:nil];

--- 共有 6 条评论 ---
Arrowing回复 @90后爱国 : 你在form.parse(req, function (err, fields, files) {之前看看req的数据是否正确,如果有的话,就找下gridform相关资料吧,或者看下源码 4年前 回复
90后爱国回复 @Arrowing : 我觉得可能是这个问题,那怎么解决呢 4年前 回复
Arrowing回复 @90后爱国 : 如果req里面有数据的话,就是gridform解析的问题了? 4年前 回复
90后爱国回复 @Arrowing : 我觉得的问题还是我后台的 4年前 回复
90后爱国回复 @Arrowing : filepath和audioData都取到了值都有并且也正常发送出去了 4年前 回复

这是三次上传的结果


files.starVoiceMessage = undefined
fields.star_id  = 534bac37c264b3c481607434
POST /upload 4002 104ms - 27b
files.starVoiceMessage = [object Object]
fields.star_id  = 534bac37c264b3c481607434
POST /upload 200 243ms - 30b
files.starVoiceMessage = [object Object]
fields.star_id  = 534bac37c264b3c481607434
POST /upload 200 152ms - 30b

我觉得现在是第一次上传文件没成功,怎么能判断上传文件成没成功

--- 共有 10 条评论 ---
Arrowing回复 @90后爱国 : 是啊,nodejs会处理的,request的data事件接收数据,end就接收完毕 4年前 回复
90后爱国回复 @Arrowing : 好的,post的传输属于流传输吗?完成之后用不用关闭流 4年前 回复
Arrowing回复 @90后爱国 : 这个问题由于我这里没有测试环境帮不上你呀,你找下和你采用同样技术架构的人吧,比如ios开发、nodejs开发群。 4年前 回复
90后爱国回复 @Arrowing : 是啊但是第一次上传总是失败的怎么办啊 4年前 回复
Arrowing回复 @90后爱国 : 你这里没有starVoiceMessage不就是失败了吗 4年前 回复
顶部