V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Sirormy
V2EX  ›  Node.js

nodejs 中关于阻塞的疑惑

  •  
  •   Sirormy · 2016-07-21 16:04:49 +08:00 · 3043 次点击
    这是一个创建于 2808 天前的主题,其中的信息可能已经有所发展或是发生改变。

    上传使用了 formidable, 有些处理用到了 listener, 那么问题来了, 监听是异步的, 如何中断返回结果呢. 看下代码

    var received = 0;
    form.on('progress', function(bytesReceived, bytesExpected) {
        received += bytesReceived;
        if (received > 1024*1024) {
        	res.json({err: "图片过大"})
        	return;
        }
    });
    

    ...

    form.parse(req, function(err, fields, files) {
        var file = files.icon;
        res.json({url: file.path.replace('public', '')})
    });
    

    这个写法是错误的, 会报 Can't set headers after they are sent. 应该如何改进呢

    6 条回复    2016-07-21 17:09:33 +08:00
    broadliyn
        1
    broadliyn  
       2016-07-21 16:31:55 +08:00
    检查 http body 的大小不是应该先去检查 http 请求头的 content-length 大小么?
    Arrowing
        2
    Arrowing  
       2016-07-21 16:34:23 +08:00
    不太明白你为什么这样写
    因为执行了 2 次 res.json
    可以加个标识变量

    ```
    var isSended = false;
    var received = 0;
    form.on('progress', function(bytesReceived, bytesExpected) {
    received += bytesReceived;
    if (!isSended && received > 1024*1024) {
    res.json({err: "图片过大"})
    return;
    }
    });
    form.parse(req, function(err, fields, files) {
    var file = files.icon;
    !isSended && res.json({url: file.path.replace('public', '')})
    });
    ```
    Arrowing
        3
    Arrowing  
       2016-07-21 16:35:08 +08:00
    忘记加上更改了 0.0
    res.json 后面加上 isSended = true;
    Sirormy
        4
    Sirormy  
    OP
       2016-07-21 16:59:38 +08:00
    @broadliyn 对 Http 请求没搞明白, 先这么写,再慢慢改,这个不是主要的问题
    Sirormy
        5
    Sirormy  
    OP
       2016-07-21 17:01:36 +08:00
    @Arrowing 你那个写法不行,没法中断程序的进行,后边是执行写文件的操作,我那样做是先判断文件大小,要阻止后边的代码
    magicdawn
        6
    magicdawn  
       2016-07-21 17:09:33 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4462 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 10:02 · PVG 18:02 · LAX 03:02 · JFK 06:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.