代码:
非常感谢
希望各位可以帮助我解决这个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); }
@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,即使用的时候应该是这样的:
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);
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
希望各位可以帮助我解决这个Error
第一次提交时没有问题,第二次就报错误 Error: write after end???
最好把整个文件的内容都贴出来 (不要截图,直接贴代码)
楼主下次记得学会Markdown语法怎么贴代码
@leizongmin 可知道到什么原因? 非常感谢
这不是说的挺清楚的吗… 在end之后调用了write.
response对象只能调用一次end.
json send 等方法内部好像都有调用end吧
@bshy522 我不知道自己哪里在end之后调用的write?? 还望指教
我上面说了呀, json send等方法的内部 都会调用end 你自己找找吧. 反正是在115行之前 跟res有关的调用.
@bshy522 好的,thanks
你可以先把一部分代码删了. 缩小范围.
这里创建的
form是不能共用的,也就是说这个form只能处理一次请求,下一个请求时需要重新创建一个form,即使用的时候应该是这样的:具体可以参考这个模块的官方文档中的示例: