求大神帮助!!!
代码:
非常感谢
12 回复
希望各位可以帮助我解决这个Error
重贴一张代码,第 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);