求大神帮助!!!
发布于 9 年前 作者 arnoma 3694 次浏览 最后一次编辑是 8 年前 来自 问答

Screen Shot 2015-05-03 at 1.00.20 PM.png

代码: Screen Shot 2015-05-03 at 1.00.41 PM.png

非常感谢

12 回复

希望各位可以帮助我解决这个Error

Screen Shot 2015-05-03 at 1.08.41 PM.png 重贴一张代码,第 115 行

第一次提交时没有问题,第二次就报错误 Error: write after end???

最好把整个文件的内容都贴出来 (不要截图,直接贴代码)

'use strict';

var _ = require('lodash');
var Activity = require('./activity.model');
var formidable = require('formidable');
var form = new formidable.IncomingForm();
var fs = require('fs');
var path = require('path');
var root = path.normalize(__dirname + '/../../..');
var ipAddress = 'http://localhost:9000';

// Get list of activitys
exports.index = function(req, res) {
  Activity.find(function (err, activitys) {
    if(err) { return handleError(res, err); }
    return res.json(200, activitys);
  });
};

// Get a single activity
exports.show = function(req, res) {
  Activity.findById(req.params.id, function (err, activity) {
    if(err) { return handleError(res, err); }
    if(!activity) { return res.send(404); }
    return res.json(activity);
  });
};


// Creates a new activity in the DB.
exports.create = function(req, res) {
  var uploadBox = root + '/upload';

  form.parse(req, function(err, fields, files){

    if(err) { return handleError(res, err); }

    var timestamp = Date.parse(new Date());
    var fileName = timestamp + '_' + files.file.name;
    var serverPath = uploadBox + '/' + fileName;

    fs.exists(uploadBox, function(exists){
      if(exists){
        fs.rename(files.file.path, serverPath, function(err){

          if(err) {return handleError(res, err)}

          fields.imageUrl = fileName;

          Activity.create(fields, function(err, activity){
            if(err) { return handleError(res, err); }
            return res.json(201, activity);
          });

        });
      } else {
        fs.mkdir(uploadBox,function(err){
          if(err) { return handleError(res, err)}
          fs.rename(files.file.path, serverPath, function(err){

            if(err) {return handleError(res, err)}

            fields.imageUrl = fileName;

            Activity.create(fields, function(err, activity){
              if(err) { return handleError(res, err); }
              return res.json(201, activity);
            });

          });
        })
      }
    });



  });

};



exports.uploadThumbnail = function(req, res){
  var uploadBox = root + '/upload';

  var saveImage = function(files){
    var timestamp = Date.parse(new Date());
    var fileName = timestamp + '_' + files.file.name;
    var serverPath = uploadBox + '/' + fileName;

    fs.rename(files.file.path, serverPath, function(err){

      if(err) {return handleError(res, err)}

      res.status(200);
      res.send({link: ipAddress + '/api/activitys/thumbnail/' + fileName});
    });

  };


  form.parse(req, function(err, fields, files){
    if(err) { return handleError(res, err)}

    fs.exists(uploadBox, function(exists){
      if(exists){
        saveImage(files);

        //res.send({link:'http://g.hiphotos.baidu.com/baike/w%3D268/sign=0456031bdbf9d72a1764171bec2a282a/b3b7d0a20cf431add5f5241d4936acaf2edd98ea.jpg'});
      } else {
        fs.mkdir(uploadBox,function(err){

          if(err) { return handleError(res, err)}
          saveImage(files);
        })
      }
    })

  });

};
exports.getThumbnail = function(req, res){

  var imageName = req.params.id;

  fs.readFile(root + '/upload/' + imageName , "binary", function(error, file){
    if(error) {
      return handleError(res, err);
    } else {

      var arr = imageName.split('.');
      var suf = arr[arr.length - 1];

      if(suf === 'jpg'){
        res.set({
          'Content-type':'image/jpeg'
        });
      } else if(suf ==='png'){
        res.set({
          'Content-type':'image/png'
        });
      }

      res.status(200);
      res.end(file, "binary");
    }

  });

};

// Updates an existing activity in the DB.
exports.update = function(req, res) {
  if(req.body._id) { delete req.body._id; }
  Activity.findById(req.params.id, function (err, activity) {
    if (err) { return handleError(res, err); }
    if(!activity) { return res.send(404); }
    var updated = _.merge(activity, req.body);
    updated.save(function (err) {
      if (err) { return handleError(res, err); }
      return res.json(200, activity);
    });
  });
};

// Deletes a activity from the DB.
exports.destroy = function(req, res) {
  Activity.findById(req.params.id, function (err, activity) {
    if(err) { return handleError(res, err); }
    if(!activity) { return res.send(404); }
    activity.remove(function(err) {
      if(err) { return handleError(res, err); }
      return res.send(204);
    });
  });
};

function handleError(res, err) {
  return res.send(500, err);
}

楼主下次记得学会Markdown语法怎么贴代码

@leizongmin 可知道到什么原因? 非常感谢

这不是说的挺清楚的吗… 在end之后调用了write.

response对象只能调用一次end.

json send 等方法内部好像都有调用end吧

@bshy522 我不知道自己哪里在end之后调用的write?? 还望指教

我上面说了呀, json send等方法的内部 都会调用end 你自己找找吧. 反正是在115行之前 跟res有关的调用.

@bshy522 好的,thanks

你可以先把一部分代码删了. 缩小范围.

var form = new formidable.IncomingForm();

这里创建的form是不能共用的,也就是说这个form只能处理一次请求,下一个请求时需要重新创建一个form,即使用的时候应该是这样的:

exports.create = function (req, res) {
  var form = new formidable.IncomingForm();
  form.parse(req, function(err, fields, files) {});
}

具体可以参考这个模块的官方文档中的示例:

var formidable = require('formidable'),
    http = require('http'),
    util = require('util');
 
http.createServer(function(req, res) {
  if (req.url == '/upload' && req.method.toLowerCase() == 'post') {
    // parse a file upload 
    var form = new formidable.IncomingForm();
 
    form.parse(req, function(err, fields, files) {
      res.writeHead(200, {'content-type': 'text/plain'});
      res.write('received upload:\n\n');
      res.end(util.inspect({fields: fields, files: files}));
    });
 
    return;
  }
 
  // show a file upload form 
  res.writeHead(200, {'content-type': 'text/html'});
  res.end(
    '<form action="/upload" enctype="multipart/form-data" method="post">'+
    '<input type="text" name="title"><br>'+
    '<input type="file" name="upload" multiple="multiple"><br>'+
    '<input type="submit" value="Upload">'+
    '</form>'
  );
}).listen(8080);
回到顶部